【发布时间】:2017-08-03 15:07:05
【问题描述】:
使用 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))) 确实允许我只拆分为 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)
【问题讨论】:
-
@Konrad 虽然这确实是可能的(例如
tidyr::extract(data=repdf,a,into=c('tax','prob'),"(.*)\\((?=\\d)(.*)",perl=TRUE),但推断具有多列的 data.frame 并不容易。 -
@Konrad:你让我思考。虽然我最初卡在
tidyr::extract的非标准评估版本上,但标准评估功能实际上非常优雅。我在下面添加了一个使用它的答案。