【问题标题】:Assign new column of a dataframe to values matching other dataframe [duplicate]将数据框的新列分配给与其他数据框匹配的值[重复]
【发布时间】:2015-11-21 15:02:16
【问题描述】:

我有两个数据框:

geodata<-read.csv(text='postalcode;latitude;longitude
7000;47.8415;16.5041
7000;47.8921;16.4011
7000;47.9400;16.5032
7071;47.8012;16.671
2443;47.9156;16.5179', sep=';', header=TRUE)

addresses<-read.csv(text='postalcode;address
2400;Lorem ipsum
7000;Dolor sit amet
2443;Consetetur sadipscing elitr
7000;Sed diam nonumy', sep=';', header=TRUE)

我需要的是 addresses 数据框中的另外两列与相应的(第一个匹配,当存在多个邮政编码行时)geodata$latitudegeodata$longitude 值。

How to join (merge) data frames (inner, outer, left, right)? 几乎显示了我正在寻找的内容,只是我不想在合并的数据框中出现重复的行。

我尝试了类似的东西

# code not working... #
addresses$latitude<-geodata[addresses$postalcode==geodata$postalcode]

我知道这真的很丑:-(

【问题讨论】:

    标签: r


    【解决方案1】:

    这里不需要使用额外的包。只需merge

    merge(geodata,addresses,all.x=TRUE)
    
    #   postalcode latitude longitude                     address
    # 1       2443  47.9156   16.5179 Consetetur sadipscing elitr
    # 2       7000  47.8415   16.5041              Dolor sit amet
    # 3       7000  47.8415   16.5041             Sed diam nonumy
    # 4       7071  47.8012   16.6710                        <NA>
    

    编辑:

    要添加地理数据到地址,我们应该在这里颠倒顺序:

    merge(addresses,geodata,all.x=TRUE)
      postalcode                     address latitude longitude
    1       2400                 Lorem ipsum       NA        NA
    2       2443 Consetetur sadipscing elitr  47.9156   16.5179
    3       7000              Dolor sit amet  47.8415   16.5041
    4       7000             Sed diam nonumy  47.8415   16.5041
    

    【讨论】:

    • ...我认为是all.x=TRUE。可怜的老merge,被所有闪亮的新工具所忽视:-)
    • @agstudy - 我认为也可以切换地址和地理数据,所以x 引用了更​​长的文件。
    • 您在此解决方案中丢失了一个地址。邮政编码 2400,地址 Lorem ipsum
    • erasmortg:丢失没有地理数据的地址是我所期望的。我的目标是将数据绘制成地图。
    【解决方案2】:

    也许有来自 dplyr 的 left_join:

    library(dplyr)
    left_join(addresses,geodata, fill=NA)
    #Joining by: "postalcode"
    #  postalcode                     address latitude longitude
    #1       2400                 Lorem ipsum       NA        NA
    #2       7000              Dolor sit amet  47.8415   16.5041
    #3       2443 Consetetur sadipscing elitr  47.9156   16.5179
    #4       7000             Sed diam nonumy  47.8415   16.5041
    

    编辑,如果每个邮政编码有多个结果,您可以尝试子集地理数据:

    #left_join(addresses, subset(geodata, !duplicated(postalcode)), fill=NA)
    #Joining by: "postalcode"
    #  postalcode                     address latitude longitude
    #1       2400                 Lorem ipsum       NA        NA
    #2       7000              Dolor sit amet  47.8415   16.5041
    #3       2443 Consetetur sadipscing elitr  47.9156   16.5179
    #4       7000             Sed diam nonumy  47.8415   16.5041
    

    【讨论】:

    • 谢谢,这几乎可以按预期工作。我编辑了我的帖子:问题是,每个邮政编码可能有多个 lat/loc 值。我需要的是 geodata datafame 中的第一个匹配行。
    • @JohannHorvat 编辑了答案,让我知道它是否有效
    【解决方案3】:

    你可以加入他们(在 plyr 中)

    library(plyr)
    addresses <- join(addresses,geodata)
    

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多