您可以使用merge 函数来做到这一点:
# Original data frame
x1 = x2 = seq(0.01,0.99,0.01)
x12 = expand.grid(x1,x2)
# Add a fake "outcome"
x12$outcome = rnorm(nrow(x12))
# New data frame with 100 random rows and the first two columns of x12
x12new = x12[sample(1:nrow(x12), 100), c(1,2)]
# Merge the outcome values from x12 into x12new
x12new = merge(x12new, x12, by=c("Var1","Var2"), all.x=TRUE)
by 告诉merge 在比较两个数据帧时哪些列必须匹配。 all.x=TRUE 告诉 merge 保留第一个数据帧中的所有行,在这种情况下为 x12new,即使它们在第二个数据帧中没有匹配项(这里不是问题,但你经常想要以确保合并时不会丢失任何行)。
另外需要注意的是,与 Excel 中的 vlookup 不同,merge 将增加新合并数据框中的行数,如果有多个行符合条件。例如,看看将值从 df2 合并到 df1 时会发生什么:
df1 = data.frame(x = c(1,2,3,4), z=c(10,20,30,40))
df2 = data.frame(x = c(1,1,1,2,3), y=c("a","b","c","a","c"))
merge(df1, df2, by="x", all.x=TRUE)
x z y
1 1 10 a
2 1 10 b
3 1 10 c
4 2 20 a
5 3 30 c
6 4 40 <NA>
您也可以使用dplyr 包中的left_join(也可以使用其他类型的连接):
library(dplyr)
left_join(df1, df2, by="x")