【问题标题】:Splitting Raw data column till n delimiters from last将原始数据列拆分到最后一个分隔符
【发布时间】:2022-11-25 21:40:19
【问题描述】:

嗨,我正在尝试拆分列
下面是我的df

value = c("AB/cc/dd/id,1,3,33","CC/DD/EE/F,F/GG,22,33,4","AB/cc,22,2,34","KK/SS/G,G,3,22,41")
df = data.frame(value)

我正在尝试拆分列并获取字符串,直到最后一个“逗号(,)”为止
即我的输出 df 应该如下所示

value1 = c("AB/cc/dd/id","CC/DD/EE/F,F/GG","AB/cc","KK/SS/G,G")
df_out = data.frame(value1)

我使用 stringr 包来完成它

library(stringr)

df[c('col1', 'col2')] <- str_split_fixed(df$value, ',', 2)

提前致谢

【问题讨论】:

    标签: r regex string dplyr


    【解决方案1】:

    使用gsub

    gsub("[^[:alpha:],/]", "", value) |> gsub(",+$", "", .)
    [1] "AB/cc/dd/id"     "CC/DD/EE/F,F/GG" "AB/cc"           "KK/SS/G,G"
    

    正则解释:

    "[^[:alpha:],/]"

    • []:定义一个字符列表
    • ^:否定该列表,gsub 将查找匹配列表中不存在的任何内容
    • [:alpha:],/:列表内容,分别为字母、逗号、“/”

    ",+$"

    • ,:匹配逗号
    • +:可能会出现一次或多次
    • $:只在字符串的末尾

    【讨论】:

      【解决方案2】:

      您可以在 base R 中尝试gsub,如下所示

      > gsub("(,[^,]+){3}$", "", value)
      [1] "AB/cc/dd/id"     "CC/DD/EE/F,F/GG" "AB/cc"           "KK/SS/G,G"
      

      【讨论】:

        【解决方案3】:

        以防万一最后 3 个逗号之间不仅有数字,而且可能有任何其他字母数字(包括 /),您可以使用此:

        a <- "AB/cc/dd/id,1,/gg/,33"
        
        stringr::str_extract(a, ".*(?=(\,[/A-z0-9]+){3})")
        #> [1] "AB/cc/dd/id"
        

        【讨论】:

          【解决方案4】:

          这是另一种获取字符串直到最后一个逗号的第三个逗号的方法没有正则表达式:

          df$value |> 
          str_split(",") |> 
          map(function(x)  x[1: (length(x)-3)] |> 
          str_c(collapse = ","))  |> 
          map_df(as.data.frame) |> 
          setNames("value1")
          
          #           value1
          #1     AB/cc/dd/id
          #2 CC/DD/EE/F,F/GG
          #3           AB/cc
          #4       KK/SS/G,G
          

          【讨论】:

            猜你喜欢
            • 2017-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-25
            • 2020-09-14
            相关资源
            最近更新 更多