我使用cbind来查找3种不同列的平均值。然而,当我这样做的时候,我得到了不同的答案:
DFNEW <- aggregate(cbind(X1, X2, X3)~Y, DF, FUN=mean)vs
DFNEW <- aggregate(cbind(X1, X2)~Y, DF, FUN=mean)当我运行命令1和运行命令2时,X1和X2的方法是不同的。X1、X2和X3都有不同数量的NA参数--这就是原因吗?部分原因可能是,我不完全确定cbind在这种情况下正在做什么。
发布于 2014-11-12 12:05:32
我想您之所以得到不同的结果是因为默认情况下,na.action=na.omit用于formula接口。因此,省略带有NAs的行,而不用于计算mean。当我们使用不同的列组合时,可以根据NA的出现删除不同的行。通过指定na.action=NULL,行将不会被删除,我们可以在计算mean时删除mean值,方法是在mean函数中使用参数na.rm=TRUE。
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))发布于 2014-11-12 12:38:52
开放源码的优点在于多样性和可用的各种工具。挺有趣的。这里有一个data.table选项供您参考。使用@akrun的数据。
library(data.table)
setDT(DF)[, lapply(.SD, mean, na.rm=T), by=Y]
# Y X1 X2 X3
# 1: C 4.142857 7.166667 1.333333
# 2: A 3.625000 6.375000 2.875000
# 3: B 3.000000 6.750000 1.500000
setDT(DF)[, lapply(.SD, mean, na.rm=T), by=Y, .SDcols=1:2]
# Y X1 X2
# 1: C 4.142857 7.166667
# 2: A 3.625000 6.375000
# 3: B 3.000000 6.750000发布于 2014-11-12 12:56:42
还可以使用拆分命令:
> sapply(split(DF, DF$Y), function(x) sapply(x[1:3], mean, na.rm=T))
A B C
X1 3.625 3.00 4.142857
X2 6.375 6.75 7.166667
X3 2.875 1.50 1.333333(使用@akrun的数据)
https://stackoverflow.com/questions/26886379
复制相似问题