【问题标题】:Merge two dataframes of different dimension, without having NAs合并两个不同维度的数据框,没有 NA
【发布时间】:2021-07-28 22:50:15
【问题描述】:

我正在尝试在 R 上合并两个不同的数据帧。一个数据帧包含大约 5000 个观察值(数据帧 A),而另一个数据帧包含 500 个(数据帧 B)。数据是关于邮政编码的。使用包zipcodeR 我从dataframeA 创建了dataframeB。事实上,在 dataframeA 的所有 5000 个观测值中,只有 500 个不同的邮政编码。现在我想从 dataframeB 中提取城市并将其添加到 dataframeA 的每一行以及相应的邮政编码。我该怎么做?

这是我正在做的一个小例子:

# DataframeA
ID   ZIP
1    91107
2    90089
3    91107
4    91107
5    94720

# DataframeB
zipcode  city
90089    Los Angeles
91107    Pasadena
94720    Berkeley

# FINAL DATASET I WANT
ID   ZIP     city
1    91107   Pasadena
2    90089   Los Angeles
3    91107   Pasadena
4    91107   Pasadena
5    94720   Berkeley

你知道怎么做吗? 我读了一些关于 if-else 的东西,但我没有得到好的结果。 另一种选择是: dataframeA$city <- dataframeA$city[match(dataframeA$ZIP, dataframeB$city)],但它不起作用。

【问题讨论】:

    标签: r dataframe merge dataset match


    【解决方案1】:

    您可以使用一些解决方案。我推荐使用dplyr 的第二个解决方案,但是第一个解决方案也可以正常工作。

    df1 <- data.frame(
      ID = 1:5,
      ZIP = c(91107,
              90089,
              91107,
              91107,
              94720)
    )
    
    df2 <- data.frame(
      zipcode = c(90089,
                  91107,
                  94720),
      city = c("Los Angeles",
               "Pasadena",
               "Berkeley")
    )
    
    # Base R
    merge(df1, df2, by.x = "ZIP", by.y = "zipcode")
    #>     ZIP ID        city
    #> 1 90089  2 Los Angeles
    #> 2 91107  1    Pasadena
    #> 3 91107  3    Pasadena
    #> 4 91107  4    Pasadena
    #> 5 94720  5    Berkeley
    
    # dplyr/tidyverse
    library(dplyr)
    df1 %>% 
      left_join(df2, by = c("ZIP" = "zipcode"))
    #>   ID   ZIP        city
    #> 1  1 91107    Pasadena
    #> 2  2 90089 Los Angeles
    #> 3  3 91107    Pasadena
    #> 4  4 91107    Pasadena
    #> 5  5 94720    Berkeley
    

    【讨论】:

    • 嗨!谢谢您的回答。我还有一个问题:从更大数据集中的 5000 开始,观测值变为 5500。你知道为什么吗?
    • 这可能是因为您的第二个数据集具有重复/非唯一值 zipcode。如果您不熟悉这些概念,我建议您阅读 this vignette 关于变异连接的内容。同时,请考虑接受我的解决方案,因为原始问题似乎已得到解答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2016-03-01
    • 1970-01-01
    • 2015-03-21
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多