计算数据框中许多因子列的均值

时间:2016-02-03 07:53:50

标签: r dataframe mean

我有一个包含因子列的数据框。这是一个很小的例子:

dat <- data.frame(one = factor(c("a", "b")), two = factor(c("c", "d")))

我可以计算每列的因子标签基础的数值的平均值:

mean(as.integer(dat$one))
[1] 1.5

但是由于我的数据框中有很多列,所以我希望避免计算所有单独的方法,而宁愿做类似的事情:

colMeans(dat)

不起作用,因为列是因子,或

colMeans(as.integer(dat))

也不起作用。

那么如何轻松计算所有因子列的均值,无需循环或单独计算它们?

我真的需要change the class of all columns吗?

4 个答案:

答案 0 :(得分:2)

data.matrix几乎是为这样的任务而设计的。它还会跳过numericinteger列(如果存在),因此可以减少内存使用量,但有时会转换为matrix。因此,只要您没有character列,这应该非常简单

colMeans(data.matrix(dat))
# one two 
# 1.5 1.5

答案 1 :(得分:1)

我们可以使用lapply

lapply(dat, function(x) mean(as.integer(x)))

dplyr

library(dplyr)
dat %>%
  summarise_each(funs(mean(as.integer(.))))

对于大数据集,最好分别按每列计算mean,因为转换为matrix也可能会产生内存问题。

答案 2 :(得分:0)

编写一个使用for循环将所有值写入向量的简单函数。

dat <- data.frame(one = c(1:10), two = c(1:10))

colMeans <- function(tablename){
  i <- 1
  colmean <- c(1:ncol(tablename))

  for(i in c(1:ncol(tablename))){
    colmean[i] <- mean(tablename[,i])
  }
  return(colmean)
}

colMeans(dat)

希望这有效

答案 3 :(得分:0)

您还可以使用data.table包,它比data.frame更快。如果您的数据很大,例如数百万观察,而不是您需要data.table来优化运行时间。

以下是代码:

library(data.table)
dat <- data.table(one = factor(c("a", "b")), two = factor(c("c", "d")))
factorCols <- c("one", "two")
dat[, lapply(.SD, FUN=function(x) mean(as.integer(x))), .SDcols=factorCols]