R 基于向量的数据表多元行子集划分
我正在寻找一种优雅的方法,基于可变长度向量动态地子集一个R 基于向量的数据表多元行子集划分,r,data.table,R,Data.table,我正在寻找一种优雅的方法,基于可变长度向量动态地子集一个data.table,分别指示要搜索的列和要匹配的值 为了说明这个问题,我有一个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 现在我有一个列名的可变长度向量cols,它是dt中列名的任意子集,例如: cols <- c("b
data.table
,分别指示要搜索的列和要匹配的值
为了说明这个问题,我有一个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
现在我有一个列名的可变长度向量cols
,它是dt
中列名的任意子集,例如:
cols <- c("b", "c")
我用一个简单的for循环成功地做到了这一点,它通过每次迭代替换dt
:
for (i in 1:length(cols)) {
dt <- dt[eval(parse(text = cols[i])) == vals[i], ]
}
dt
我想知道的是,是否有一个不那么笨重的单行命令,也可以节省大量的运行时间,特别是如果我们将此代码应用于非常大的
数据表
,以及cols
和VAL分配的大量子集参数,“大量子集参数”的输入/输出示例是什么?这里不容易发布可复制的示例。但假设dt是一个大数据表,有超过500k行、100列和50个元素的cols圆锥曲线。在这种情况下,我发布的for循环将经过50次迭代,在大型数据集上反复应用subset命令。在这种情况下,一次只对dt进行一次子集设置的单行命令将节省大量运行时间。这就是我想知道的原因。对于“大量的子集参数”,输入/输出的示例是什么?在这里发布一个可复制的示例并不容易。但假设dt是一个大数据表,有超过500k行、100列和50个元素的cols圆锥曲线。在这种情况下,我发布的for循环将经过50次迭代,在大型数据集上反复应用subset命令。在这种情况下,一次只对dt进行一次子集设置的单行命令将节省大量运行时间。这就是为什么我想知道。还有dt[setNames(as.list(vals),cols),on=.NATURAL]
还有dt[setNames(as.list(vals),cols),on=.NATURAL]
setkeyv(dt, cols)
dt[as.list(vals)]
# a b c
# 1: 4 6 5
for (i in 1:length(cols)) {
dt <- dt[eval(parse(text = cols[i])) == vals[i], ]
}
dt
a b c
1: 4 6 5
setkeyv(dt, cols)
dt[as.list(vals)]
# a b c
# 1: 4 6 5