我有一个包含因子列的数据框。这是一个很小的例子:
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))
也不起作用。
那么如何轻松计算所有因子列的均值,无需循环或单独计算它们?
答案 0 :(得分:2)
data.matrix
几乎是为这样的任务而设计的。它还会跳过numeric
和integer
列(如果存在),因此可以减少内存使用量,但有时会转换为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]