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

9

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

我们可以使用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

使用正则表达式 (?=\\+|-) 进行拆分,在"nothing"处进行拆分,以防止在该位置后面出现不匹配的加号或减号+-

5
在 `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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接