【问题标题】:Why does merge result in more rows than original data?为什么合并导致比原始数据更多的行?
【发布时间】:2014-07-31 19:01:49
【问题描述】:

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

在本例中,all 数据框有 104956 行koppen3968 行 alltest 数据框有 130335 行。通常,alltest 的行数应该等于或小于 all

为什么会发生这种通货膨胀?我不确定给出可重现的示例是否会有所帮助,因为它在我之前使用过的实例中确实有效。

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

【问题讨论】:

  • 可能是因为两个数据框之一的 fips 重复值。
  • 哦,等等,ALL 当然有重​​复的 FIPS。它不应该是唯一的。知道如何在不增加这些行的情况下合并吗?
  • nrow(koppen)==length(unique(koppen$fips)) 是否返回 TRUE?如果不是,则有重复值 fips
  • 如何在不增加行数的情况下明确合并它们?
  • “我不确定给出可重现的示例是否会有所帮助,因为它在我之前使用过的实例中确实有效。”一个可重现的示例应该重现您遇到的问题。

标签: r join


【解决方案1】:

首先,来自?merge

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

在 cmets 中使用您的链接:

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 代码。检查数据集和网站,似乎许多县都属于不止一个气候等级,例如,阿拉斯加的安克拉治县有三个气候等级:

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 中的所有行以及出现在koppen 中的任何FIPS,则这些都应该可以工作:

merge(all,unique(koppen$FIPS))

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

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

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

编辑基于以下 cmets 中的交流。

因此,由于有时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")

【讨论】:

  • 一会儿试试。
  • 您先生是救生员。谢谢你。 :)
  • 好的,一个问题..我当然也需要这门课。当我使用merge(all,unique(koppen[c("STATE","COUNTY","CLASS","FIPS")]),by="FIPS") 时,它再次超出了所需的行数。但是当我只使用州、县、fips 时,代码可以正常工作。这是为什么呢?
  • 一个给定的 FIPS 可以有多个类。你要哪个班?如果你想要所有这些,那么就会有重复的 FIPS。
  • 问题在于,对于给定的 FIPS,koppen 中有多个 CLS。因此,如果您想要所有这些,则在合并中每个 FIPS 将获得不止一行。以 Ankorage 为例。如果all 有一行 FIPS=2020,并且您想要来自koppen 的所有三个 CLS,那么您将在 FIPS=2020 的合并中拥有三行。如果all 有多行 FIPS=2020,那么结果中将有三行 all 中 FIPS=2020 的每一行
猜你喜欢
  • 2017-05-25
  • 2017-01-14
  • 2015-08-05
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多