gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:29:42 25 4
gpt4 key购买 nike

当我合并两个数据框时,结果的行数比原始数据多。

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

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

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

最佳答案

首先,来自 ?merge:

The rows in the two data frames that match on the specified columns are extracted, and joined together. If there is more than one match, all possible matches contribute one row each.

使用评论中的链接:

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")

编辑基于下面评论中的交流。

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

关于r - 为什么合并会产生比原始数据更多的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24150765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com