给出一个小的工作示例,假设我有以下数据框:
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()
函数就足够了。这仍然会表现出我要摆脱的行为。
请注意,对于第一年的国家A,列出的人口是NA
。因此,当我运行
aggregate(Money ~ Country+Year+Category+Population, df, sum)
结果数据框删除了与国家A和年份1对应的行。我仅使用...+Population...
位代码,因为我希望输出数据框保留该列。
我想知道如何使aggregate()
函数不会删除出现分组的列中有NA
的东西,例如,如果{ {1}}本身可以视为要分组的值。
我的尝试:我尝试将“人口”列转换为因素,但这并没有改变行为。我在NA
参数上看到了一些内容,但是na.action
和na.action=NULL
都没有改变行为。我曾考虑过尝试将所有na.action=na.skip
都设为0,但我想不出会造成什么伤害,但感觉好像是一种hack,以后可能会刺伤我-不确定。但是,如果我尝试这样做,我不确定该怎么做。当我编写一个带有NA
函数的函数时,它没有以向量化的方式应用is.na()
测试,并给出了一个错误,即它只会使用向量的第一个元素。我考虑过也许在列上使用if (is.na(x))
并将其强制返回到矢量并将其粘贴在列中,但这听起来有点琐,而且不必要绕来绕去。
这里的解决方案似乎是首先将lapply()
值保留在数据帧之外,而我不能这样做:Aggregate raster in R with NA values
答案 0 :(得分:3)
就像您在数据之前提到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的样本数据没有针对同一组的多行。因此,汇总行数将与实际行数相同。