R-聚合函数添加新分组列时的不同结果
我是一个R-初学者,我陷入困境,找不到解决办法。如有任何评论,我们将不胜感激。问题是: 我有一个数据帧df。 这些列被转换为char(属性)和num。 我想通过使用聚合函数来减少数据帧(dply不是一个选项) 当我使用R-聚合函数添加新分组列时的不同结果,r,aggregate-functions,R,Aggregate Functions,我是一个R-初学者,我陷入困境,找不到解决办法。如有任何评论,我们将不胜感激。问题是: 我有一个数据帧df。 这些列被转换为char(属性)和num。 我想通过使用聚合函数来减少数据帧(dply不是一个选项) 当我使用 df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1")], sum) df_agg我最好的猜测是您的一些分组列中缺少值。在内置的mtcars数据上进行演示,没有遗漏值,一切正常: sum(mtcars$mpg) # [1]
df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1")], sum)
df_agg我最好的猜测是您的一些分组列中缺少值。在内置的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”
,我认为@Gregor已经正确地指出,问题可能是分组变量具有NA
。dplyr
处理变量分组中的NA
的方式不同于aggregate
我们有另一种解决方案,即aggregate
。请注意,该文件建议:
这是线索。您可以使用exclude=”“
将分组变量转换为factor
,这将确保NA
是factor的一部分
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和exclude=NULL为我实现了这个技巧(exclude=”“不起作用)。非常感谢。是的,在相应的列中有NA。
`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.
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
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