我正在使用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
在这种情况下做了什么。
答案 0 :(得分:2)
开源的美妙之处在于可用的多样性和工具。非常有趣。这是一个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
答案 1 :(得分:1)
我猜你得到不同结果的原因是因为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))
答案 2 :(得分:0)
还可以使用split命令:
> 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的数据)