【问题标题】:Equivalence of 'vlookup' in R for multiple columns?R中多列的“vlookup”等价?
【发布时间】:2018-03-02 01:55:52
【问题描述】:

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

x1 = x2 = seq(0.01,0.99,0.01)
x12 = data.matrix(expand.grid(x1,x2))

第三列包含结果值。

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

我该怎么做?

【问题讨论】:

    标签: r vlookup


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多