r - 子集 data.table 基于单独的 data.table
问题描述
我有一个主表
library(data.table); set.seed(42)
D1 <- data.table(id=rep(1:3,each=2), name=rep(c("a","b")), val=runif(6,0,1))
> D1
id name val
1: 1 a 0.9148060
2: 1 b 0.9370754
3: 2 a 0.2861395
4: 2 b 0.8304476
5: 3 a 0.6417455
6: 3 b 0.5190959
为每个 指定两个值id
,nameda
和b
。我要选择的值在辅助表中确定
D2 <- data.table(id=1:3, name=c("a","a","b"))
我想D1
使用D2
. 我可以在循环中按 ID 执行此 ID,但考虑到我的数据维度,我希望有一个更有效的解决方案,也许使用连接。
解决方案
我们可以使用连接,它会更快,因为我们已经有了data.table
对象
D1[D2, on = .(id, name)]
# id name val
#1: 1 a 0.9148060
#2: 2 a 0.2861395
#3: 3 b 0.5190959
或inner_join
从dplyr
library(dplyr)
inner_join(D1, D2)
或match
使用base R
D2$val <- D1$val[match(paste(D2$id, D2$name), paste(D1$id, D1$name))]
推荐阅读
- amazon-s3 - Apache Flink - s3 文件夹监控 - 许多文件丢失
- spyder - spyder(python)不打开(实际上没有给出任何错误)
- deep-learning - 连接来自不同来源的编码器隐藏状态/单元/输出以进行注意力计算 - 问题?
- java - 为什么这个 Java 代理服务器很慢?
- sql - postgresql 查询找不到带有外来字母的结果
- java - 如何在 Android 中处理 MVVM 中的回调和状态
- node.js - 如何在 get() 函数中实现多个集合?
- python - For循环替代函数中的多个列(熊猫)
- c++ - 如何将 QBytearray BCD 转换为十进制 QString 表示?
- html - Angular 5材质数据网格自动高度