将数据框的新列分配给与其他数据框匹配的值[重复]
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$latitude 和 geodata$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)
【讨论】:
以上是关于将数据框的新列分配给与其他数据框匹配的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章