我有几个数据框a
b
c
d
,每个都有相同的列名。我想找到这些数据帧的均值和中位数。换句话说,构建与mean
,median
等大小相同的新a
和b
数据框。
我可以使用几个for
循环,但我敢打赌,使用R内置函数可以更快地完成此操作。
答案 0 :(得分:9)
按照Josh Ulrich的回答,怎么样
library(abind)
apply(abind(a,b,c,d,along=3),c(1,2),median)
?
(在相应切片上使用rowMeans
仍然会比apply
mean
更快......我认为rowMedians
(Bioconductor)中有Biobase
如果你真的需要速度包?)
答案 1 :(得分:2)
我不确定JD的答案会为您提供您想要的内容,因为生成的对象与a
,b
等的尺寸不同。
将data.frames放入列表是一个好的开始。然后,您可以将每列列入一个新列表,cbind
列入矩阵并在其行上使用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)))
})
答案 2 :(得分:1)
您可以将数据帧串入数据框列表,然后使用lapply(myList, mean, ...)