在一个条件下分配一个字符串
Posted
技术标签:
【中文标题】在一个条件下分配一个字符串【英文标题】:assign a string under a condition 【发布时间】:2021-03-17 19:41:40 【问题描述】:我有一个这样的字符串。
"457, 1480-(5, 12), 83-(1, 2), 484, 484-(2, 3, 8)"
我只想在有括号的情况下为每个元素分配一个标题编号。 我想要的输出是这个
"457, 1480-5, 1480-12, 83-1, 83-2, 484, 484-2, 484-3, 484-8"
我该怎么做?
【问题讨论】:
【参考方案1】:我不确定我是否完全回答了这个问题,但我已将第一个列表更改为第二个列表(在数据框中)。
library(tidyverse)
library(stringi)
df <- tibble::tribble(
~column,
"457, 480-(5, 12), 483-(1, 2), 484, 484-(2, 3, 8)"
)
以下使用逗号作为分隔符分隔部分,删除括号,然后我使用 stringi 重新格式化数字。我创建了 2 个额外的列,一个用于主要的 3 位数字(main_number),一个用于子集号(用 - 表示)。重新格式化后,如果没有子集,我将使用 main_number,其余部分粘贴 main_number 和子集这两列。
df2 <- df %>%
mutate(split_out = strsplit(as.character(column), ",")) %>%
tidyr::unnest(split_out) %>%
select(-column) %>%
mutate(split_out = str_remove(split_out, "[()]"),
split_out = str_trim(split_out), # has trailing whitespace
main_number = case_when(stri_length(split_out) == 3 ~ split_out,
TRUE ~ substr(split_out, 1, str_locate(split_out, "-") -1)),
subset = case_when(str_detect(split_out, "-") == TRUE ~ substr(split_out,
str_locate(split_out, "-"), # where - appears + 1
stri_length(split_out)), # the end of the string
stri_length(split_out) < 3 ~ paste0("-", split_out),
TRUE ~ NA_character_)) %>%
fill(main_number, .direction = c("down")) %>% # fill down so the main number is copied down
mutate(new_number = case_when(is.na(subset) ~ main_number,
TRUE ~ paste0(main_number, subset)
)) %>%
select(new_number)
【讨论】:
非常感谢。不幸的是,我有一个大数据集,stri_length(split_out) 并不总是 3。我更新了这个问题。你能帮我解决更新后的问题吗? 主要数字(例如:410-4000)和子数字(例如:1-20)的范围是多少。这将更好地了解将数字设置为什么,因为您可能需要更改 case_when(stri_length(split_out) => 3 以表示它是否等于或大于 3 个字符。以上是关于在一个条件下分配一个字符串的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose TypeScript ObjectId 转换 - 类型“字符串”不可分配给类型“条件<ObjectId |未定义>'
Mongoose TypeScript ObjectId 转换 - 类型“字符串”不可分配给类型“条件<ObjectId |未定义>'