首页 > 解决方案 > 基于向量的data.table的多元行子集

问题描述

我正在寻找一种data.table基于可变长度向量动态子集 a 的优雅方法,分别指示要搜索的列和要匹配的值。

为了说明问题,我有一个data.table如下:

dt <- data.table(a = c(1, 3, 2, 5, 4, 1, 3), b = c(2, 3, 5, 1, 6, 2, 5), c = c(4, 2, 5, 2, 5, 2, 1))
dt
   a b c
1: 1 2 4
2: 3 3 2
3: 2 5 5
4: 5 1 2
5: 4 6 5
6: 1 2 2
7: 3 5 1

现在我有一个可变长度的列名向量,cols它是 中列名的任意子集dt,例如:

cols <- c("b", "c")

给定该向量,我有一个具有相应长度的向量,vals其中指示的列cols必须与之匹配,例如:

vals <- c(6, 5)

我设法用一个简单的 for 循环来做到这一点,它被dt每次迭代所取代:

for (i in 1:length(cols)) {
  dt <- dt[eval(parse(text = cols[i])) == vals[i], ]
}
dt

并收到了预期的结果:

   a b c
1: 4 6 5

我只是想知道是否有一个不那么粗的单行命令也可以节省大量的运行时间,特别是如果我们将此代码应用于由anddata.tables分配的非常大而且数量更大的子集参数。colsvals

标签: rdata.table

解决方案


setkeyv(dt, cols)
dt[as.list(vals)]
#    a b c
# 1: 4 6 5

推荐阅读