等价于';vlookup';对于多个列,是否在R中?

等价于';vlookup';对于多个列,是否在R中?,r,vlookup,R,Vlookup,我有一个9801×3的参考表。 此表的前2列定义如下 x1 = x2 = seq(0.01,0.99,0.01) x12 = data.matrix(expand.grid(x1,x2)) 第三列包含结果值 现在我有另一个n×3矩阵,其中第1列和第2列是上述矩阵“x12”的选定行,第3列将被填充。我想通过查找第一个表中第1列和第2列的相同组合来填写第2个表的第3列,并在第3列中找到值 如何执行此操作?您可以使用合并功能执行此操作: # Original data frame x1 = x2 =

我有一个9801×3的参考表。 此表的前2列定义如下

x1 = x2 = seq(0.01,0.99,0.01)
x12 = data.matrix(expand.grid(x1,x2))
第三列包含结果值

现在我有另一个n×3矩阵,其中第1列和第2列是上述矩阵“x12”的选定行,第3列将被填充。我想通过查找第一个表中第1列和第2列的相同组合来填写第2个表的第3列,并在第3列中找到值


如何执行此操作?

您可以使用
合并功能执行此操作:

# 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)

您可以使用
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)