将数据框的新列分配给与其他数据框匹配的值[重复]

Posted

技术标签:

【中文标题】将数据框的新列分配给与其他数据框匹配的值[重复]【英文标题】: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]

我知道这真的很丑:-(

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于将数据框的新列分配给与其他数据框匹配的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用另一个数据框的匹配值向数据框添加新列[重复]

在数据框的新列中需要词频 // scala

如何在 pandas groupby 对象上应用函数并将结果保存回父数据框的新列?

包含 Pandas 的新列中包含列表的值计数 [重复]

如何有条件地将子字符串复制到熊猫数据框的新列中?

在附属机构中查找城市名称,并将它们与其对应的国家/地区添加到数据框的新列中