r - 基于向量的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
分配的非常大而且数量更大的子集参数。cols
vals
解决方案
setkeyv(dt, cols)
dt[as.list(vals)]
# a b c
# 1: 4 6 5
推荐阅读
- angular - 聚焦克隆的元素
- reactjs - CollectionFS,使用 ReactJS 显示图像
- html - 使 NavItem 背景颜色与 NavBar 相同
- python - 使用期间列迭代日期列,直到结束日期;按 id 列对结果进行分组。
- python - Azure 事件中心 Python SDK
- xamarin - Half Screen-Width Sized Layouts (With Images in them)
- .net - .NET COM+ 对象不能从 ASP Classic 中使用
- c# - Multi-Target .NET Standard 2.0 and .NET 4.5 fails due to missing .net 4.5 framework
- java - 应用程序编程模型 $filter 操作
- ibm-mq - 关于 websphere mq 临时动态队列创建者 zOS RACF