【问题标题】:Selecting rows in data.table on the basis of a substring match to any of multiple columns根据与多个列中的任何列匹配的子字符串选择 data.table 中的行
【发布时间】:2016-10-02 00:56:36
【问题描述】:

我有一个类似这样的 data.table,但列更多:

library(data.table)
the_dt = data.table(DetailCol1=c("Deets1","Deets2","Deets3","Deets4"), DetailCol2 = c("MoreDeets1","MoreDeets2","MoreDeets3","MoreDeets4"), DataCol1=c("ARP","AARPP","ABC","ABC"), DataCol2=c("ABC","ABC","ABC","ARPe"), DataCol3 = c("ABC", "ARP", "ABC","ABC"))

我只想检索那些包含与字符串“ARP”匹配的行的 DetailCol1。

This question 在将我指向 like 时很有用,但我仍然不确定如何为多个列执行此操作,尤其是如果我想在其中搜索几十个列。

例如,这就是我在 DataCol1 中搜索的方式 the_dt[DataCol1 %like% 'ARP',DetailCol1],但是如何在 DataCols 1-100 中进行相同的搜索?

【问题讨论】:

  • This question 可能会有所帮助。参考grep
  • 如果你在所有 'DataCol's 上应用这个 %like% ,在这个例子中,预期的输出是什么
  • Varontron,如果我可以避免在 data.table 中使用 with=F,grepping colnames() 可能会很有用...
  • Akrun,在上面的代码中,我会得到 deets1 和 deets2。如果有意义的话,对所有数据列应用相同的搜索也应该返回 deets 4。
  • 你可能想melt你的data.table,这样你就可以只搜索一列...

标签: r data.table


【解决方案1】:

我们可以在.SDcol中指定要比较的列,使用lapply循环遍历它,使用%like%将其转换为逻辑,使用Reduce检查每行是否至少有一个TRUE,使用它将“DetailCol1”中的元素子集。

the_dt[the_dt[, Reduce(`|`, lapply(.SD, `%like%`, "ARP")),
                       .SDcols= DataCol1:DataCol3], DetailCol1]

【讨论】:

  • 成功了。谢谢,阿克伦!减少是一个非常酷的技巧!
  • @Atticus29 感谢您的反馈。是的,对于这种情况,这是一个方便的功能。
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2022-11-03
  • 2021-09-08
  • 2013-01-15
相关资源
最近更新 更多