为什么合并会产生比原始数据更多的行?

时间:2014-06-10 21:02:01

标签: r join

当我merge两个数据帧时,结果的行数比原始数据多。

在这种情况下,所有数据框的 104956行 koppen 3968行 alltest 数据框有 130335行。通常,alltest应该有等于或小于所有的行。

为什么会发生这种通货膨胀?我不确定是否提供可重复的示例会有所帮助,因为它在之前我使用它的实例中起作用。

alltest <- merge(all, koppen, by = "fips", sort = F)

1 个答案:

答案 0 :(得分:8)

首先,来自?merge

  

提取两个数据框中与指定列匹配的行,并将它们连接在一起。如果有多个匹配,则所有可能的匹配每个贡献一行

在评论中使用您的链接:

url    <- "http://koeppen-geiger.vu-wien.ac.at/data/KoeppenGeiger.UScounty.txt"
koppen <- read.table(url, header=T, sep="\t")
nrow(koppen)
# [1] 3594
length(unique(koppen$FIPS))
# [1] 2789

很明显koppen有重复的FIPS代码。检查数据集和网站,似乎许多县都属于多个气候类别,例如,阿拉斯加州Ankorage县有三个气候类别:

koppen[koppen$FIPS==2020,]
#     STATE    COUNTY FIPS CLS  PROP
# 73 Alaska Anchorage 2020 Dsc 0.010
# 74 Alaska Anchorage 2020 Dfc 0.961
# 75 Alaska Anchorage 2020  ET 0.029

解决方案取决于您要完成的任务。如果您要使用all中显示的任何FIPS提取koppen中的所有行,则其中任何一行都应该有效:

merge(all,unique(koppen$FIPS))

all[all$FIPS %in% unique(koppen$FIPS),]

如果您需要将县和州名称附加到all,请使用:

merge(all,unique(koppen[c("STATE","COUNTY","FIPS")]),by="FIPS")

编辑根据评论中的下方交流。

所以,由于koppen中有时候多行有FIPSCLS不同,我们需要一种方法来决定哪一行(例如CLS 1}})选择。这有两种方式:

# this extracts the row with the largest value of PROP, for that FIPS
url        <- "http://koeppen-geiger.vu-wien.ac.at/data/KoeppenGeiger.UScounty.txt"
koppen     <- read.csv(url, header=T, sep="\t")
koppen     <- with(koppen,koppen[order(FIPS,-PROP),])
sub.koppen <- aggregate(koppen,by=list(koppen$FIPS),head,n=1)
result     <- merge(all, sub.koppen, by="FIPS")

# this extracts a row at random
sub.koppen <- aggregate(koppen,by=list(koppen$FIPS), 
                        function(x)x[sample(1:length(x),1)])
result     <- merge(all, sub.koppen, by="FIPS")