2017-03-04 70 views
3

我想匹配一个正则表达式,输出几个值,并就地为它分配到几个新的变量里面data.table多个正则表达式匹配和分配data.table

library(data.table) 
library(stringr) 

fruit_regex <- "(\\d+): apples=(.*), oranges=(.*)" 

DT <- data.table(V1=c("1: apples=0.1, oranges=0.01", 
      "2: apples=0.2, oranges=0.02", 
      "3: apples=0.3, oranges=0.03", 
      "4: apples=0.4, oranges=0.04", 
      "5: apples=0.5, oranges=0.05")) 

DT[, c("txt","id","apples", "oranges"):= as.list(str_match_all(V1, fruit_regex))] 

这当然,失败,我得到

>Warning messages: 
>1: In `[.data.table`(DT, , `:=`(c("txt", "id", "apples", "oranges"), : 
> Supplied 4 columns to be assigned a list (length 5) of values (1 unused) 

str_match_all()说要矢量在图案和字符串,但由于某些原因,我不能得到它的工作。

还有一个已知的问题与我的正则表达式返回一个多余的完全匹配,可以通过lookaround断言来治愈。

期望的结果(从冗余V1txt领域望着远处):

id apples oranges 
1  0.1 0.01 
2  0.2 0.02 
3  0.3 0.03 
4  0.4 0.04 
5  0.5 0.05 

回答

3

您需要将您的结果到的东西,R可以插入到数据帧,如另一个数据帧。 例如,使用“plyr”包解决

library(data.table) 
library(stringr) 
library(plyr) 
fruit_regex <- "(\\d+): apples=(.*), oranges=(.*)" 

DT <- data.table(V1=c("1: apples=0.1, oranges=0.01", 
     "2: apples=0.2, oranges=0.02", 
     "3: apples=0.3, oranges=0.03", 
     "4: apples=0.4, oranges=0.04", 
     "5: apples=0.5, oranges=0.05")) 

DT[, c("txt","id","apples", "oranges"):= ldply(str_match_all(V1, fruit_regex))] 
+0

Shahar,非常感谢你提出'ldply'。我也意识到,'purrr :: transpose()'可以以类似的方式提供帮助,然后我发现'data.table'也可以转置列表。我的文件的性质比我在示例中提供的要少,所以我将有几个匹配模式应用于文件的不同子集。我也试图尽可能地导入尽可能少的软件包,因为这可能会以自己的软件包结束。不过谢谢你的主意! – dmi3kno

+0

随时。 总的想法是简单地确保最终的结构是你想要的方式。我简单地选择了第一个想到的功能,虽然我同意转置更优雅(它是直接说你想要发生什么,而不是简单地碰巧在这里工作的ldply) –