data.table 中的多个正则表达式匹配和赋值
Multiple regex match and assignment in 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()
说要对模式和字符串进行矢量化,但由于某种原因我无法让它工作。
我的正则表达式还有另一个已知问题,returns 是一个冗余的完全匹配项,可以通过环视断言解决。
期望的结果(远离冗余的 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
您需要将结果转换为 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))]
我正在尝试匹配输出多个值的正则表达式并将其就地分配给 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()
说要对模式和字符串进行矢量化,但由于某种原因我无法让它工作。
我的正则表达式还有另一个已知问题,returns 是一个冗余的完全匹配项,可以通过环视断言解决。
期望的结果(远离冗余的 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
您需要将结果转换为 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))]