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 - 添加新分组列时聚合函数不同的结果的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用agg函数计算每个分组不同数值变量的聚合统计值agg参数为字典指定不同变量的聚合计算统计量的形式
使用 r,我如何将不是基本聚合函数的函数 (moments::skewness) 应用于分组表?
R语言进行数据聚合统计(Aggregating transforms)实战:使用R原生方法data.tabledplyr等方案计算分组均值并添加到可视化结果中