r - 根据模式的一部分拆分数据框列中的文本

标签 r strsplit

使用 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::cSplitstringr::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/

相关文章:

r - 如何在R中创建因子交互变量?为什么我不能直接乘法?

r - r 中具有二进制输出的数据透视表

regex - 提取逗号分隔的字符串

R strsplit 使用正则表达式

regex - 在matlab中将一个字符串分成两部分

r - 使用一组样本插值新值

r - 如何在 R 中创建缺少值的曲面图?

r - 错误消息

r - 使用重复的定界符分割字符串

Matlab strsplit 在非键盘字符处