使用Aggregate和Cbind-NA问题?

时间:2014-11-12 11:54:50

标签: r aggregate na cbind

我正在使用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在这种情况下做了什么。

3 个答案:

答案 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的数据)