R 在相同条件下为多列筛选data.table
我使用列名向量来选择data.table的一个子集。我想知道是否可以在R 在相同条件下为多列筛选data.table,r,data.table,R,Data.table,我使用列名向量来选择data.table的一个子集。我想知道是否可以在I中基本上定义条件,然后将这些条件应用于所有选定的列。 例如,使用mtcars数据集。 我想选择圆柱和齿轮,然后想过滤所有有四个圆柱和四个齿轮的汽车。当然,我还需要定义过滤器是否为和或或,但我感兴趣的是,这个想法是否可以以某种方式应用于data.table上下文中 # working code sel.col <- c("cyl", "gear") dt <- data.table(mtcars[1:4,]) d
I
中基本上定义条件,然后将这些条件应用于所有选定的列。
例如,使用mtcars
数据集。
我想选择圆柱和齿轮,然后想过滤所有有四个圆柱和四个齿轮的汽车。当然,我还需要定义过滤器是否为和
或或
,但我感兴趣的是,这个想法是否可以以某种方式应用于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]
#工作代码
sel.col我们可以使用get
sel.col <- "cyl"
dt[get(sel.col) == 4, ..sel.col]
# cyl gear
#1: 4 4
之前,我们认为只有一列需要评估。如果我们有多个列,请在.SDcols
中指定它,循环遍历Data.table(.SD
)的子集,将其与感兴趣的值('4')进行比较,将其减少为逻辑向量,并使用|
,即每行中的任何TRUE,并基于此对行进行子集化
dt[dt[, Reduce(`|`, lapply(.SD, `==`, 4)),.SDcols = sel.col], ..sel.col]
但无法将其更改为或
条件,对吗?@hannes101我没有收到您的查询。目前所有列都需要具有相同的值,另一种可能是只需要满足其中一个条件,例如,只有四个齿轮或四个气缸。然后结果会有更多可能的组合。是的,似乎有效。虽然它很难阅读,而且我可能很难再掌握它,但在几个月后查看代码时。@hannes101如果向量中有多个元素,最好通过这条路线。或者你可以做dt[get(sel.col[1])==4 | get(sel.col[2])==4,…sel.col]
当“sel.col”的长度增加时,这将成为一个练习。有什么相关问题:。
dt[dt[, Reduce(`|`, lapply(.SD, `==`, 4)),.SDcols = sel.col], ..sel.col]