R data.table中的多个正则表达式匹配和赋值

R data.table中的多个正则表达式匹配和赋值,r,data.table,stringr,R,Data.table,Stringr,我正在尝试匹配一个输出多个值的正则表达式,并将其指定给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", "

我正在尝试匹配一个输出多个值的正则表达式,并将其指定给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))]
str\u match\u all()
表示要在模式和字符串上进行矢量化,但由于某些原因,我无法使其工作

我的正则表达式还有一个已知的问题,它返回一个冗余的完全匹配,可以通过lookaround断言来解决

所需结果(从冗余的
V1
txt
字段中查看):


您需要将结果转换为R可以插入到数据帧中的内容,例如另一个数据帧。 例如,使用“plyr”包解决

库(data.table)
图书馆(stringr)
图书馆(plyr)

fruit_regex Shahar,非常感谢您提出
ldply
。我还意识到,
purrr::transpose()
也有类似的帮助,然后我发现
data.table
也可以转换列表。我的文件的性质没有我在示例中提供的那么同质,因此我将有几个匹配模式应用于文件的不同子集。我还试图导入尽可能少的包,因为这可能会在它自己的包中结束。不过,谢谢你的主意!随时总体思路是简单地确保生成的结构是您希望的方式。我只是简单地选择了我想到的第一个函数,尽管我同意转置更优雅(它直接说明了你想要发生什么,而ldply正好在这里工作)
>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)
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
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))]