提问人:Hack-R 提问时间:2/27/2016 最后编辑:CommunityHack-R 更新时间:2/27/2016 访问量:1217
矢量化 data.table,如 grepl 或类似内容,用于大数据字符串比较
Vectorize data.table like, grepl, or similar for big data string comparison
问:
我需要检查一列中的字符串是否包含来自另一列同一行的相应(数字)值,对于所有行。
如果我只检查单个模式的字符串,这将很简单,使用 data.table 的 or .但是,我的模式值对于每一行都是不同的。like
grepl
这里有一个有点相关的问题,但与这个问题不同的是,我需要创建一个逻辑标志来指示模式是否存在。
假设这是我的数据集;
DT <- structure(list(category = c("administration", "nurse practitioner",
"trucking", "administration", "warehousing", "warehousing", "trucking",
"nurse practitioner", "nurse practitioner"), industry = c("admin",
"truck", "truck", "admin", "nurse", "admin", "truck", "nurse",
"truck")), .Names = c("category", "industry"), class = "data.frame", row.names = c(NA,
-9L))
setDT(DT)
> DT
category industry
1: administration admin
2: nurse practitioner truck
3: trucking truck
4: administration admin
5: warehousing nurse
6: warehousing admin
7: trucking truck
8: nurse practitioner nurse
9: nurse practitioner truck
我想要的结果将是这样的向量:
> DT
matches
1: TRUE
2: FALSE
3: TRUE
4: TRUE
5: FALSE
6: FALSE
7: TRUE
8: TRUE
9: FALSE
当然,1 和 0 与 TRUE 和 FALSE 一样好。
以下是我尝试过的一些不起作用的方法:
apply(DT,1,grepl, pattern = DT[,2], x = DT[,1])
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> apply(DT,1,grepl, pattern = DT[,1], x = DT[,2])
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> grepl(DT[,2], DT[,1])
[1] FALSE
> DT[Vectorize(grepl)(industry, category, fixed = TRUE)]
category industry
1: administration admin
2: trucking truck
3: administration admin
4: trucking truck
5: nurse practitioner nurse
> DT[stringi::stri_detect_fixed(category, industry)]
category industry
1: administration admin
2: trucking truck
3: administration admin
4: trucking truck
5: nurse practitioner nurse
> for(i in 1:nrow(DT)){print(grepl(DT[i,2], DT[i,1]))}
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
> for(i in 1:nrow(DT)){print(grepl(DT[i,2], DT[i,1], fixed = T))}
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
> DT[category %like% industry]
category industry
1: administration admin
2: administration admin
Warning message:
In grepl(pattern, vector) :
argument 'pattern' has length > 1 and only the first element will be used
答:
7赞
akrun
2/27/2016
#1
在 OP 的代码中,没有使用 。因此,根据该方法,它将子集对应于索引的行。,
data.table
i
但是,如果我们指定我们正在玩的 ,我们得到逻辑向量作为结果,
j
DT[, stri_detect_fixed(category, industry)]
#[1] TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE
假设,我们将其保存在 中,然后我们得到带有列的list
data.table
DT[, list(match=stri_detect_fixed(category, industry))]
评论
0赞
Hack-R
2/27/2016
@akrun 对解决方案是正确的,而 Frank 对错误是正确的。非常感谢!
1赞
akrun
2/27/2016
@Frank 谢谢,我更新了解决方案。如果缺少任何内容,请随时添加。
3赞
count
2/27/2016
#2
或使用:
apply(DT, 1, function(x) grepl(x[2], x[1],fixed=T))
评论
0赞
Hack-R
2/27/2016
这也行得通。这就是我在第一个例子中试图做的事情。我想知道为什么我索引它的方式打破了它。我猜行是由 apply() 中的边距暗示的。
3赞
eddi
2/27/2016
#3
我通常这样做:
DT[, flag := grepl(industry, category, fixed = TRUE), by = industry]
评论