-1

cbind用来查找 3 个不同列的平均值。但是,当我这样做时,我会得到不同的答案:

  DFNEW <- aggregate(cbind(X1, X2, X3)~Y, DF, FUN=mean)

对比

  DFNEW <- aggregate(cbind(X1, X2)~Y, DF, FUN=mean)

当我运行命令 1 和运行命令 2 时,X1 和 X2 的方法是不同的。X1、X2 和 X3 都有不同数量的 NA 参数 - 这是原因吗?部分原因也可能是我不完全确定cbind在这种情况下正在做什么。

4

3 回答 3

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
于 2014-11-12T12:38:52.963 回答
1

我猜你得到不同结果的原因是因为默认情况下,na.action=na.omit对于formula界面。因此,带有NAs 的行被省略,不用于计算mean。当我们使用不同的列组合时,可以根据NA. 通过指定na.action=NULL,行将不会被删除,我们可以在使用函数中的参数NA计算 时删除值。meanna.rm=TRUEmean

  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-12T12:05:32.857 回答
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 的数据)

于 2014-11-12T12:56:42.663 回答