繁体   English   中英

基于 R 中的两个 grep() 命令寻址 data.table 列

[英]Adressing data.table columns based on two grep() commands in R

我试图根据 data.table 中的两个条件查找行。 这两个条件是长字符串中存在某些单词。 一个最小的示例如下所示:

library("data.table")
dt <- data.table(var1 = c("abc","adb","acf"))

现在我尝试通过在var1的同一条目中查找同时出现的"a""b"来找到元素 1 和 2。 实际上,数据表有几十万个条目,字符串是长公式,我在其中查找多字符单词。 这是我的尝试:

dt[grep("a", var1) & grep("b", var1)]

引发警告:

In grep("a", var1) & grep("b", var1) :
longer object length is not a multiple of shorter object length

看起来data.table正在按顺序做某事? 在我看来,这应该与dt[var1 == X & var2 == Y]相同,这将起作用......感谢任何帮助!

ps:为了完整起见,这里是对我希望具有相同来源的实际数据的警告(否则我的示例是垃圾):

Error in `[.data.table`(collected, grep(pairs[i, 1], model_formula) &  : 
i evaluates to a logical vector length 423098 but there are 3980284 rows. 
Recycling of logical i is no longer allowed as it hides more bugs than is 
worth the rare convenience. Explicitly use rep(...,length=.N) if you 
really need to recycle.
In addition: Warning message:
In grep(pairs[i, 1], model_formula) & grep(pairs[i, 2], model_formula) :
longer object length is not a multiple of shorter object length

grep grepl它应该可以正常工作..或按照评论中的说明调整您的正则表达式。

dt[grepl("a", var1) & grepl("b", var1)]

#    var1
# 1:  abc
# 2:  adb

基于intersect()的第三个选项:

dt[intersect(grep("a", var1), grep("b", var1))]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM