使用 R,我尝试将具有指定分隔符的列中的文本拆分为始终两个新列。示例数据框如下:
repdf <- data.frame(a=c("abc(100)","def(95)","ghi(100)","j_(klm)(100)"),b=c("abc(100)","def(95)","ghi(100)","j_(klm)(100)"))
简单地说,我想在每个左括号“(”处进行拆分,但前提是它后面跟着一个数字,但不会丢失数字。即所需的结果应该如下所示:
a1 a2 b1 b2
abc 100) abc 100)
def 95) def 95)
ghi 100) ghi 100)
j_(klm) 100) j_(klm) 100)
我尝试使用splitstackshape::cSplit
和stringr::str_split_fixed
但无济于事。
cSplit(repdf,c("a","b"),"(")
在每个“(”处分割
a_1 a_2 a_3 b_1 b_2 b_3
1: abc 100) NA abc 100) NA
2: def 95) NA def 95) NA
3: ghi 100) NA ghi 100) NA
4: j_ klm) 100) j_ klm) 100)
cSplit(repdf,c("a","b"),"\\(([0-9])",fixed=FALSE)
删除第一个数字(如果可以)可以使用 \1
将捕获添加到第二组,这会很好,但遗憾的是事实并非如此。
a_1 a_2 b_1 b_2
1: abc 00) abc 00)
2: def 5) def 5)
3: ghi 00) ghi 00)
4: j_(klm) 00) j_(klm) 00)
as.data.frame(lapply(repdf,function(x)str_split_fixed(x,"\\(",n=2)))
确实允许我只分成两列,但当然只需要第一场比赛:
a.1 a.2 b.1 b.2
1 abc 100) abc 100)
2 def 95) def 95)
3 ghi 100) ghi 100)
4 j_ klm)(100) j_ klm)(100)
最佳答案
这就是前瞻派上用场的地方......本质上我们寻找 (
后面跟着一个数字 \\d
但前瞻不使用分割的数字。
do.call(cbind, lapply(repdf, function(x){
do.call(rbind, strsplit(as.character(x), "\\((?=\\d)", perl = TRUE))
}))
# [,1] [,2] [,3] [,4]
# [1,] "abc" "100)" "abc" "100)"
# [2,] "def" "95)" "def" "95)"
# [3,] "ghi" "100)" "ghi" "100)"
# [4,] "j_(klm)" "100)" "j_(klm)" "100)"
关于r - 根据模式的一部分拆分数据框列中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488128/