【问题标题】:Split column by multiple delimiters, keeping delimiters通过多个分隔符拆分列,保留分隔符
【发布时间】:2019-05-11 22:33:34
【问题描述】:

如何使用 %、- 和 + 作为可能的分隔符将字符列拆分为 3 列,并将分隔符保留在新列中?

示例数据:

data <- data.table(x=c("92.1%+100-200","90.4%-1000+200", "92.8%-200+100", "99.2%-500-200","90.1%+500-200"))

所需数据示例:

data.desired <- data.table(x1=c("92.1%", "90.4%", "92.8%","99.2%","90.1%")
                           , x2=c("+100","-1000","-200","-500","+500")
                           , x3=c("-200","+200","+100","-200","-200"))

很高兴为一个好的答案和一些帮助奖励积分!

【问题讨论】:

    标签: r regex data.table strsplit


    【解决方案1】:

    我们可以使用tidyr 中的separate 进行拆分,并使用正向前瞻来保留分隔符:

    data %>% separate(x, c("x1", "x2", "x3"), sep = "(?=\\+|-)")
    #       x1    x2   x3
    # 1: 92.1%  +100 -200
    # 2: 90.4% -1000 +200
    # 3: 92.8%  -200 +100
    # 4: 99.2%  -500 -200
    # 5: 90.1%  +500 -200
    

    也就是说,请注意,只需通过\\+|- 进行拆分,我们会得到

    data %>% separate(x, c("x1", "x2", "x3"), sep = "\\+|-")
    #       x1   x2  x3
    # 1: 92.1%  100 200
    # 2: 90.4% 1000 200
    # 3: 92.8%  200 100
    # 4: 99.2%  500 200
    # 5: 90.1%  500 200
    

    使用(?=\\+|-) 在“无”处拆分,以防之后我们有+-(不匹配)。

    【讨论】:

      【解决方案2】:

      data.table 中相当于tstrsplit

      data[, c("x1","x2","x3") := tstrsplit(x, "(?<=.)(?=[+-])", perl=TRUE) ]
      data
      #                x    x1    x2   x3
      #1:  92.1%+100-200 92.1%  +100 -200
      #2: 90.4%-1000+200 90.4% -1000 +200
      #3:  92.8%-200+100 92.8%  -200 +100
      #4:  99.2%-500-200 99.2%  -500 -200
      #5:  90.1%+500-200 90.1%  +500 -200
      

      【讨论】:

        【解决方案3】:

        这是一个使用base R的选项

        cbind(data, read.csv(text = gsub("(?=[+-])", ",", data$x, perl = TRUE), 
            header = FALSE, stringsAsFactors = FALSE, col.names = c('x1', 'x2', 'x3')))
        #                x    x1    x2   x3
        #1:  92.1%+100-200 92.1%   100 -200
        #2: 90.4%-1000+200 90.4% -1000  200
        #3:  92.8%-200+100 92.8%  -200  100
        #4:  99.2%-500-200 99.2%  -500 -200
        #5:  90.1%+500-200 90.1%   500 -200
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-18
          • 2012-01-10
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          • 2013-10-30
          • 2015-02-26
          相关资源
          最近更新 更多