R - 添加新分组列时聚合函数不同的结果

Posted

技术标签:

【中文标题】R - 添加新分组列时聚合函数不同的结果【英文标题】:R - Aggregate Function different Results When Adding new grouping column 【发布时间】:2018-12-12 02:25:35 【问题描述】:

我是 R 初学者,我被困住了,找不到解决方案。任何评论都受到高度赞赏。问题来了:

我有一个数据框 df。 这些列被转换为 char(属性)和 num。 我想通过使用聚合函数来减少数据帧(dply 不是一个选项)。

当我使用聚合时

df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1")], sum)

我得到正确的结果。但我想按更多属性分组。例如添加更多属性时

df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1", "ATTRIBUTE2")], sum)

然后在某个时候,聚合结果会发生变化。 Amount 的总和不再等于第一个第一个聚合(或原始数据帧)的结果。

有谁知道导致这种行为的原因。

【问题讨论】:

【参考方案1】:

我的最佳猜测是您的某些分组列中缺少值。在内置的mtcars数据上演示,没有缺失值,一切正常:

sum(mtcars$mpg)
# [1] 642.9
sum(aggregate(mtcars["mpg"], mtcars[c("am")], sum)$mpg)
# [1] 642.9
sum(aggregate(mtcars["mpg"], mtcars[c("am", "cyl")], sum)$mpg)
# [1] 642.9

但是如果我们在分组变量中引入缺失值,它就不会包含在聚合中:

mt = mtcars
mt$cyl[1] = NA
sum(aggregate(mt["mpg"], mt[c("am", "cyl")], sum)$mpg)
# [1] 621.9

最简单的解决方法是用 NA 以外的其他值填充缺失值,也许是字符串 "missing"

【讨论】:

【参考方案2】:

我认为@Gregor 已正确指出问题可能是具有NA 的分组变量。 dplyr 处理 NA 的变量分组方式与 aggregate 不同。

我们有aggregate 的替代解决方案。请注意,该文件建议

`by`   a list of grouping elements, each as long as the variables in the data
       frame x. The elements are coerced to factors before use.

这里有线索。您可以使用exclude="" 将分组变量转换为factor,这将确保NA 是因素的一部分。

set.seed(1)

df <- data.frame(ATTRIBUTE1 = sample(LETTERS[1:3], 10, replace = TRUE),
                 ATTRIBUTE2 = sample(letters[1:3], 10, replace = TRUE),
                 AMOUNT = 1:10)

df$ATTRIBUTE2[5] <- NA


aggregate(df["AMOUNT"], by = list(factor(df$ATTRIBUTE1,exclude = ""),
                                  factor(df$ATTRIBUTE2, exclude="")), sum)

#   Group.1 Group.2 AMOUNT
# 1       A       a      1
# 2       B       a      2
# 3       B       b      9
# 4       C       b     10
# 5       A       c     10
# 6       B       c     11
# 7       C       c      7
# 8       A    <NA>      5

分组变量未显式转换为factor以包含NA时的结果为:

aggregate(df["AMOUNT"], df[c("ATTRIBUTE1", "ATTRIBUTE2")], sum)
#   ATTRIBUTE1 ATTRIBUTE2 AMOUNT
# 1          A          a      1
# 2          B          a      2
# 3          B          b      9
# 4          C          b     10
# 5          A          c     10
# 6          B          c     11
# 7          C          c      7     

【讨论】:

使用 factor 和 exclude = NULL 对我有用(exclude = “” 不起作用)。非常感谢。是的,在各个列中都有 NA。

以上是关于R - 添加新分组列时聚合函数不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

窗口聚合函数与分组聚合函数的异同

如何对具有聚合函数的 Oracle 查询进行分组

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用agg函数计算每个分组不同数值变量的聚合统计值agg参数为字典指定不同变量的聚合计算统计量的形式

使用 r,我如何将不是基本聚合函数的函数 (moments::skewness) 应用于分组表?

R语言进行数据聚合统计(Aggregating transforms)实战:使用R原生方法data.tabledplyr等方案计算分组均值并添加到可视化结果中

Django 09-1模型层 查询(分组聚合)