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断言来治愈。
期望的结果(从冗余V1
和txt
领域望着远处):
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
Shahar,非常感谢你提出'ldply'。我也意识到,'purrr :: transpose()'可以以类似的方式提供帮助,然后我发现'data.table'也可以转置列表。我的文件的性质比我在示例中提供的要少,所以我将有几个匹配模式应用于文件的不同子集。我也试图尽可能地导入尽可能少的软件包,因为这可能会以自己的软件包结束。不过谢谢你的主意! – dmi3kno
随时。 总的想法是简单地确保最终的结构是你想要的方式。我简单地选择了第一个想到的功能,虽然我同意转置更优雅(它是直接说你想要发生什么,而不是简单地碰巧在这里工作的ldply) –