【问题标题】:Filter data.table on same condition for multiple columns针对多个列在相同条件下过滤 data.table
【发布时间】:2018-07-16 10:29:36
【问题描述】:

我正在使用列名向量来选择 data.table 的列子集。我有一个想法,如果可以基本上在i 中定义条件,然后将其应用于所有选定的列。 例如使用mtcars 数据集。 我想选择列气缸和齿轮,然后想过滤所有具有四个气缸和四个齿轮的汽车。当然,我还需要定义过滤器是 and 还是 or,但我只是想知道这个想法是否可以在 data.table 上下文中以某种方式应用。

# working code
sel.col <- c("cyl", "gear")
dt <- data.table(mtcars[1:4,])

dt[, ..sel.col]
dt[cyl == 4 & gear == 4, ..sel.col]    


# Non-working code
dt[ sel.col == 4 , ..sel.col]

【问题讨论】:

标签: r data.table


【解决方案1】:

我们可以使用get

sel.col <- "cyl"
dt[get(sel.col) == 4, ..sel.col]
#    cyl gear
#1:   4    4

eval(as.name

dt[eval(as.name(sel.col)) == 4, ..sel.col]
#    cyl gear
#1:   4    4

之前,我们认为只有一个列需要评估。如果我们有多个列,请在.SDcols 中指定它,循环遍历 Data.table 的子集 (.SD) 将其与感兴趣的值 ('4') 进行比较,Reduce 将其与逻辑向量| 即每行中的任何 TRUE 并基于此对行进行子集

dt[dt[, Reduce(`|`, lapply(.SD, `==`, 4)),.SDcols = sel.col], ..sel.col]

【讨论】:

  • 但是没有办法将其更改为 or 条件,对吧?
  • @hannes101 我没有收到您的询问。
  • 目前所有列都需要具有相同的值,另一种可能性是只需要满足一个条件,例如只需要四个齿轮或四个气缸。那么结果就会有更多可能的组合。
  • @hannes101 如果向量中有多个元素,最好走这条路线。或者你可以做dt[get(sel.col[1]) == 4 | get(sel.col[2])==4, ..sel.col] 当'sel.col'的长度增加时这将成为一个练习
  • 我认为您保留答案的第一部分只是关于使用get 有点令人困惑。虽然只有答案的第二部分回复了原始问题,但我建议删除第一部分
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2018-04-13
  • 2020-07-07
  • 2017-08-29
相关资源
最近更新 更多