【问题标题】:Adressing data.table columns based on two grep() commands in R基于 R 中的两个 grep() 命令寻址 data.table 列
【发布时间】:2020-08-05 11:08:57
【问题描述】:

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

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

现在我尝试通过查找"a""b" 一起出现在var1 的同一个条目中来找到元素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 &amp; var2 == Y] 相同,它会起作用......感谢任何帮助!

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

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

【问题讨论】:

  • dt[grep("a.*b|b.*a", var1)]
  • 非常感谢并诅咒你:正则表达式!我永远不会明白他们的窍门......你能否详细说明正在发生的事情。和 *?
  • 另外,如果我的尝试没有太多要求,了解为什么我的尝试不起作用会很有趣
  • a.*b|b.*a 匹配 a 后跟任何 0+ 字符,然后是 b,或匹配 b,然后是 0+ 字符,然后是 a。不太可扩展。

标签: r data.table


【解决方案1】:

grep 替换为grepl,它应该可以正常工作。或者按照cmets 中的说明调整您的正则表达式。

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

#    var1
# 1:  abc
# 2:  adb

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多