我有一张主桌
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提供两个值,名为a和b。要选择的值是在辅助表中确定的。
D2 <- data.table(id=1:3, name=c("a","a","b"))我想使用D1来对D2进行子集。我可以在循环中通过ID执行这个ID,但考虑到数据的维度,我希望有一个更有效的解决方案,也许可以使用一个join。
发布于 2019-12-25 15:56:37
我们可以使用一个连接,它会更快,因为我们已经有了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))]发布于 2019-12-25 16:52:44
一个R基解是通过使用merge(),即,
> merge(D2,D1)
id name val
1: 1 a 0.9148060
2: 2 a 0.2861395
3: 3 b 0.5190959https://stackoverflow.com/questions/59479909
复制相似问题