【问题标题】: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"

我该怎么做?

【问题讨论】:

    标签: r dplyr stringr


    【解决方案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 个字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多