【问题标题】:Lookup values in a vectorized way以矢量化方式查找值
【发布时间】:2026-01-30 14:25:02
【问题描述】:

我一直在阅读有关矢量化功能的重要性的文章,因此希望有人可以在这里帮助我。

假设我有一个包含两列的数据框:nameID。现在我还有另一个带有姓名和出生地的数据框,但是这个数据框比第一个大得多,并且包含第一个数据框中的一些但不是全部的名称。如何将第三列添加到第一个表中,其中填充了使用第二个表查找的出生地。

我现在拥有的是:

corresponding.birthplaces <- sapply(table1$Name, 
   function(name){return(table2$Birthplace[table2$Name==name])})

这似乎效率低下。想法?有谁知道“正确”使用 R 的好书/资源。我觉得我通常确实以可以想象的计算效率最低的方式思考。

谢谢:)

【问题讨论】:

    标签: r


    【解决方案1】:

    请参阅?merge,它将执行数据库链接合并或连接。

    这是一个例子:

    set.seed(2)
    d1 <- data.frame(ID = 1:5, Name = c("Bill","Bob","Jessica","Jennifer","Robyn"))
    d2 <- data.frame(Name = c("Bill", "Gavin", "Bob", "Joris", "Jessica", "Andrie", 
                              "Jennifer","Joshua","Robyn","Iterator"),
                     Birthplace = sample(c("London","New York",
                                           "San Francisco", "Berlin",
                                           "Tokyo", "Paris"), 10, rep = TRUE))
    

    给出:

    > d1
      ID     Name
    1  1     Bill
    2  2      Bob
    3  3  Jessica
    4  4 Jennifer
    5  5    Robyn
    > d2
           Name    Birthplace
    1      Bill      New York
    2     Gavin         Tokyo
    3       Bob        Berlin
    4     Joris      New York
    5   Jessica         Paris
    6    Andrie         Paris
    7  Jennifer        London
    8    Joshua         Paris
    9     Robyn San Francisco
    10 Iterator        Berlin
    

    然后我们使用merge() 进行连接:

    > merge(d1, d2)
          Name ID    Birthplace
    1     Bill  1      New York
    2      Bob  2        Berlin
    3 Jennifer  4        London
    4  Jessica  3         Paris
    5    Robyn  5 San Francisco
    

    【讨论】: