在R中查找数据框的平均数和中位数

4
我有几个数据框,abcd,它们的列名相同。我想找到这些数据框的平均数和中位数。换句话说,构建与ab等大小相同的新的meanmedian数据框。
我可以使用一些for循环,但我敢打赌,使用R内置函数的巧妙方法会更快。
3个回答

9
跟随Josh Ulrich的答案,怎么样?
library(abind)
apply(abind(a,b,c,d,along=3),c(1,2),median)

使用适当的切片后使用rowMeans仍然比apply mean更快...如果你真的需要速度,我认为Biobase(Bioconductor)包中有一个rowMedians

2

我不确定JD的回答是否完全符合您的要求,因为结果对象的维度与a、b等不同。

将您的数据框放入列表中是一个好的开始。然后,您可以将每个列子集成一个新列表,将该列表合并为矩阵,并在其行上使用apply。

a <- data.frame(rnorm(10), runif(10))
b <- data.frame(rnorm(10), runif(10))
c <- data.frame(rnorm(10), runif(10))
d <- data.frame(rnorm(10), runif(10))
myList <- list(a,b,c,d)
sapply(1:ncol(a), function(j) {  # median
  apply(do.call(cbind,lapply(myList,`[`,,j)), 1, median)
})
sapply(1:ncol(a), function(j) {  # mean
  apply(do.call(cbind,lapply(myList,`[`,,j)), 1, mean)
})
sapply(1:ncol(a), function(j) {  # faster mean
  rowMeans(do.call(cbind,lapply(myList,`[`,,j)))
})

1
您可以将数据框字符串成一个数据框列表,然后使用lapply(myList, mean, ...)函数。

如果你的意思是 lapply(c(a, b), mean),那就不对了。这会给我每列单独的平均值,而不是跨数据框的平均值。 - tkerwin
哦哦哦哦...我没意识到你想要它们全部合并。 - JD Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接