示例数据
考虑以下两个data.frames作为示例
set.seed(12)
d1 = cbind(
expand.grid(1:4,LETTERS[1:3]),
rnorm(12,10,1)
)[sample(1:12),]
d2 = as.data.frame(
cbind(
sample(c(1,2,4),900, replace=TRUE),
sample(LETTERS[1:3],900,replace=TRUE)
)[sample(1:900),]
)
names(d1) = c("x","y","z")
names(d2) = c("x","y")
d1
很小,包含x
和y
的所有可能组合,并包含z
变量。 d2
要长得多,不一定包含x
和y
的所有可能组合,并且不包含z
变量。在这两个变量中,x
和y
的组合没有逻辑顺序(如示例所示)。
目标
如何根据z
和d1
的组合,将d2
变量的值从x
输入y
?
糟糕的解决方案
d2$z = 0
for (x in unique(d1$x))
{
for (y in unique(d1$y))
{
d2$z[d2$x == x & d2$y == y] = d1$z[d1$x == x & d1$y == y]
}
}
head(d2)
x y z
1 2 B 9.727704
2 1 C 9.893536
3 2 A 11.577169
4 1 A 8.519432
5 4 C 8.706118
6 2 B 9.727704
但是,当data.frames为几百万行时,它非常慢。此外,它不是很灵活。
有更好的选择吗?