【发布时间】:2023-03-25 06:48:01
【问题描述】:
我有几个数据框,abcd,每个都有相同的列名。我想找到这些数据框的平均值和中位数。也就是说,构造与a、b等大小相同的新mean和median数据帧。
我可以使用几个 for 循环,但我敢打赌,使用 R 内置函数可以更快地做到这一点。
【问题讨论】:
我有几个数据框,abcd,每个都有相同的列名。我想找到这些数据框的平均值和中位数。也就是说,构造与a、b等大小相同的新mean和median数据帧。
我可以使用几个 for 循环,但我敢打赌,使用 R 内置函数可以更快地做到这一点。
【问题讨论】:
按照 Josh Ulrich 的回答,怎么样
library(abind)
apply(abind(a,b,c,d,along=3),c(1,2),median)
?
(在适当的切片上使用rowMeans 仍然会比applying mean 快...如果您真的需要速度,我认为Biobase(Bioconductor)包中有一个rowMedians?)
【讨论】:
我不确定 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)))
})
【讨论】:
你可以将你的数据框串成一个数据框列表,然后使用lapply(myList, mean, ...)
【讨论】:
lapply(c(a, b), mean),那是不对的。这给了我每列的平均值,而不是跨数据框。