R:如何汇总NA值

时间:2018-07-28 20:40:39

标签: r

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

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.actionna.action=NULL都没有改变行为。我曾考虑过尝试将所有na.action=na.skip都设为0,但我想不出会造成什么伤害,但感觉好像是一种hack,以后可能会刺伤我-不确定。但是,如果我尝试这样做,我不确定该怎么做。当我编写一个带有NA函数的函数时,它没有以向量化的方式应用is.na()测试,并给出了一个错误,即它只会使用向量的第一个元素。我考虑过也许在列上使用if (is.na(x))并将其强制返回到矢量并将其粘贴在列中,但这听起来有点琐,而且不必要绕来绕去。

这里的解决方案似乎是首先将lapply()值保留在数据帧之外,而我不能这样做:Aggregate raster in R with NA values

1 个答案:

答案 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的样本数据没有针对同一组的多行。因此,汇总行数将与实际行数相同。