gpt4 book ai didi

R:如何聚合 NA 值

转载 作者:行者123 更新时间:2023-12-05 02:15:34 24 4
gpt4 key购买 nike

举一个小的工作示例,假设我有以下数据框:

library(dplyr)
country <- rep(c("A", "B", "C"), each = 6)
year <- rep(c(1,2,3), each = 2, times = 3)
categ <- rep(c(0,1), times = 9)
pop <- rep(c(NA, runif(n=8)), each=2)
money <- runif(18)+100

df <- data.frame(Country = country,
Year = year,
Category = categ,
Population = pop,
Money = money)

现在我实际处理的数据有更多的重复,即对于每个国家、年份和类别,有许多重复的行对应于各种资金来源,我想将这些加在一起。但是,现在每个国家、年份和类别只需要一行,然后在每一行上简单地应用 sum() 函数就足够了。这仍然会表现出我试图摆脱的行为。

请注意,对于第 1 年的国家 A,列出的人口是 NA。因此当我运行时

aggregate(Money ~ Country+Year+Category+Population, df, sum)

生成的数据框删除了对应于国家 A 和年份 1 的行。我只使用了 ...+Population... 代码位,因为我想要输出数据框保留此栏。

我想知道如何使 aggregate() 函数不丢弃在分组发生的列中具有 NA 的东西——它会是例如,如果 NA 本身可以被视为要分组的值,那就太好了。

我的尝试:我尝试将 Population 列转换为因子,但这并没有改变行为。我在 na.action 参数上阅读了一些内容,但 na.action=NULLna.action=na.skip 都没有改变行为。我考虑过尝试将所有 NA 都变成 0,但我想不出这会带来什么伤害,但感觉就像是一种黑客攻击,以后可能会咬我一口——不确定。但如果我尝试这样做,我不确定我会怎么做。当我编写一个包含 is.na() 函数的函数时,它没有以矢量化方式应用 if (is.na(x)) 测试并给出了它只会使用向量的第一个元素的错误。我考虑过也许在列上使用 lapply() 并将其强制转换回一个向量并将其粘贴在列中,但这听起来有点老套而且不必要地迂回。

这里的解决方案似乎是首先将 NA 值保留在数据框之外,这是我做不到的:Aggregate raster in R with NA values

最佳答案

正如您在数据之前提到的dplyr,您可以使用dplyr::summarise 函数。 summarise 函数支持对 NA 值进行分组。

library(dplyr)
df %>% group_by(Country,Year,Category,Population) %>%
summarise(Money = sum(Money))

# # A tibble: 18 x 5
# # Groups: Country, Year, Category [?]
# Country Year Category Population Money
# <fctr> <dbl> <dbl> <dbl> <dbl>
# 1 A 1.00 0 NA 101
# 2 A 1.00 1.00 NA 100
# 3 A 2.00 0 0.482 101
# 4 A 2.00 1.00 0.482 101
# 5 A 3.00 0 0.600 101
# 6 A 3.00 1.00 0.600 101
# 7 B 1.00 0 0.494 101
# 8 B 1.00 1.00 0.494 101
# 9 B 2.00 0 0.186 100
# 10 B 2.00 1.00 0.186 100
# 11 B 3.00 0 0.827 101
# 12 B 3.00 1.00 0.827 101
# 13 C 1.00 0 0.668 100
# 14 C 1.00 1.00 0.668 101
# 15 C 2.00 0 0.794 100
# 16 C 2.00 1.00 0.794 100
# 17 C 3.00 0 0.108 100
# 18 C 3.00 1.00 0.108 100

注意:OP 的示例数据没有针对同一组的多行。因此,汇总行数将与实际行数相同。

关于R:如何聚合 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51575106/

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