我猜你得到不同结果的原因是因为默认情况下,na.action=na.omit
对于formula
界面。因此,带有NA
s 的行被省略,不用于计算mean
。当我们使用不同的列组合时,可以根据NA
. 通过指定na.action=NULL
,行将不会被删除,我们可以在使用函数中的参数NA
计算 时删除值。mean
na.rm=TRUE
mean
aggregate(cbind(X1, X2)~Y, DF, FUN=mean, na.rm=TRUE, na.action=NULL)
#Y X1 X2
#1 A 3.625000 6.375000
#2 B 3.000000 6.750000
#3 C 4.142857 7.166667
aggregate(cbind(X1, X2, X3)~Y, DF, FUN=mean, na.rm=TRUE, na.action=NULL)
# Y X1 X2 X3
#1 A 3.625000 6.375000 2.875000
#2 B 3.000000 6.750000 1.500000
#3 C 4.142857 7.166667 1.333333
我们从上面得到的结果将与下面相同,即不使用formula
接口
aggregate(DF[,c("X1", "X2")], list(Y=DF[,"Y"]), FUN= mean, na.rm=TRUE)
# Y X1 X2
# 1 A 3.625000 6.375000
# 2 B 3.000000 6.750000
# 3 C 4.142857 7.166667
aggregate(DF[,c("X1", "X2", "X3")], list(Y=DF[,"Y"]), FUN= mean, na.rm=TRUE)
# Y X1 X2 X3
#1 A 3.625000 6.375000 2.875000
#2 B 3.000000 6.750000 1.500000
#3 C 4.142857 7.166667 1.333333
如果你想要一些替代品,你可以使用dplyr
library(dplyr)
DF %>%
group_by(Y) %>%
summarise_each(funs(mean=mean(., na.rm=TRUE)))
# Source: local data frame [3 x 4]
# Y X1 X2 X3
#1 A 3.625000 6.375000 2.875000
#2 B 3.000000 6.750000 1.500000
#3 C 4.142857 7.166667 1.333333
DF %>%
group_by(Y) %>%
summarise_each(funs(mean=mean(., na.rm=TRUE)), X1, X2)
#Source: local data frame [3 x 3]
# Y X1 X2
#1 A 3.625000 6.375000
#2 B 3.000000 6.750000
#3 C 4.142857 7.166667
数据
set.seed(42)
DF <- data.frame(X1=sample(c(NA, 1:5), 25, replace=TRUE),
X2= sample(c(NA, 1:10), 25, replace=TRUE), X3= sample(c(NA,0:5), 25,
replace=TRUE), Y=sample(LETTERS[1:3], 25, replace=TRUE))