计算data.frame中多列的平均值

时间:2015-06-19 15:07:17

标签: r

只是想知道是否可以通过使用均值函数来计算多列的均值

e.g。

mean(iris[,1])

是可能的但不是

mean(iris[,1:4])

尝试:

mean(iris[,c(1:4)])

收到此错误消息:

  

警告消息:在mean.default(iris [,1:4])中:参数不是   数字或逻辑:返回NA

我知道我可以使用     lapply(光圈[1:4],平均值) 要么     sapply(光圈[1:4],平均值)

3 个答案:

答案 0 :(得分:8)

尝试colMeans

但该列必须是数字。您可以为更大的数据集添加测试。

colMeans(iris[sapply(iris, is.numeric)])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 

<强>基准

dplyrdata.table似乎很长。也许有人可以复制这些发现以获得真实性。

microbenchmark(
  plafort = colMeans(big.df[sapply(big.df, is.numeric)]),
  Carlos  = colMeans(Filter(is.numeric, big.df)),
  Cdtable = big.dt[, lapply(.SD, mean)],
  Cdplyr  = big.df %>% summarise_each(funs(mean))
  )
#Unit: milliseconds
#    expr       min        lq     mean    median       uq       max
# plafort  9.862934 10.506778 12.07027 10.699616 11.16404  31.23927
#  Carlos  9.215143  9.557987 11.30063  9.843197 10.21821  65.21379
# Cdtable 57.157250 64.866996 78.72452 67.633433 87.52451 264.60453
#  Cdplyr 62.933293 67.853312 81.77382 71.296555 91.44994 182.36578

数据

m <- matrix(1:1e6, 1000)
m2 <- matrix(rep('a', 1000), ncol=1)
big.df <- as.data.frame(cbind(m2, m), stringsAsFactors=F)
big.df[,-1] <- lapply(big.df[,-1], as.numeric)
big.dt <- as.data.table(big.df)

答案 1 :(得分:5)

使用sapply + Filter

sapply(Filter(is.numeric, iris), mean)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 

使用dplyr:

library(dplyr)
iris %>% summarise_each(funs(mean))
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:     5.843333    3.057333        3.758    1.199333      NA

使用data.table:

library(data.table)
iris <- data.table(iris)
iris[,lapply(.SD, mean)]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:     5.843333    3.057333        3.758    1.199333      NA

答案 2 :(得分:1)

假设列的列号是正确的is.numeric格式,您的上述解决方案确实有效。见下面的例子:

a <- c(1,2,3)
mean(a)

b <- c(2,4,6)
mean(b)

d <- c(3,6,9)

mydata <- cbind(b,a,d)


mean(mydata[,1:3])