R语言 在相同条件下为多列筛选data.table

rlcwz9us  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(252)

我使用一个列名向量来选择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]
a9wyjsp7

a9wyjsp71#

我们可以使用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中指定它,循环通过数据子集。table(.SD)将其与感兴趣的值('4 ')进行比较,Reduce将其与|的逻辑向量进行比较,即每个行中的任何TRUE,并根据此

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

htrmnn0y2#

我知道这是一个相当古老的线程,但我认为社区仍然会受益于一个更简单的解决方案。
我们可以使用data.table join来处理多列的情况

# create test data
sel.col <- c("cyl", "gear")
dt <- data.table(mtcars)

# create key / index
mykey <- setNames(list(4,4), sel.col)

# select rows with values specified in mykey
dt <- dt[mykey, on = sel.col]
dt[, ..sel.col]

或者在一行中:

dt[setNames(list(4,4), sel.col), ..sel.col, on = sel.col]

子集条件可以使用非等连接进一步推广,例如cyl >= 4。这种方法已经被描述为here

相关问题