代码之家  ›  专栏  ›  技术社区  ›  Neal Barsch

按多个分隔符拆分列,保留分隔符

  •  3
  • Neal Barsch  · 技术社区  · 6 年前

    如何使用%、-、和+作为可能的分隔符将字符列拆分为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"))
    

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

    3 回复  |  直到 6 年前
        1
  •  4
  •   Julius Vainora    6 年前

    我们可以使用 separate 从…起 tidyr 对于拆分和正向前瞻,以保留分隔符:

    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
  •  3
  •   thelatemail    6 年前

    在里面 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
  •  2
  •   akrun    6 年前

    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
    
    推荐文章