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

Gee*_*ata 10 join r

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

在这个例子中,所有数据帧有104956行,koppen3968行,alltest数据帧有130335行.通常,alltest应该有等于或小于all的行.

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

alltest <- merge(all, koppen, by = "fips", sort = F)
Run Code Online (Sandbox Code Playgroud)

jlh*_*ard 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
Run Code Online (Sandbox Code Playgroud)

显然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
Run Code Online (Sandbox Code Playgroud)

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

merge(all,unique(koppen$FIPS))

all[all$FIPS %in% unique(koppen$FIPS),]
Run Code Online (Sandbox Code Playgroud)

如果您需要附加县和州名称all,请使用以下命令:

merge(all,unique(koppen[c("STATE","COUNTY","FIPS")]),by="FIPS")
Run Code Online (Sandbox Code Playgroud)

编辑基于以下交流中的评论.

因此,由于有时候有多个行koppen具有相同FIPS但不同的行CLS,我们需要一种方法来决定选择哪一行(例如,哪些行CLS).这有两种方式:

# 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")
Run Code Online (Sandbox Code Playgroud)