当我merge
两个数据帧时,结果的行数比原始数据多。
在这种情况下,所有数据框的 104956行, koppen 3968行和 alltest 数据框有 130335行。通常,alltest应该有等于或小于所有的行。
为什么会发生这种通货膨胀?我不确定是否提供可重复的示例会有所帮助,因为它在之前我使用它的实例中起作用。
alltest <- merge(all, koppen, by = "fips", sort = F)
答案 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
中有时候多行有FIPS
但CLS
不同,我们需要一种方法来决定哪一行(例如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")