Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于向量的数据表多元行子集划分_R_Data.table - Fatal编程技术网

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