如何跨三个多列数据帧的行计算均值?

How to calculate means across rows of three multi-column dataframes?

假设我有 3 个数据框,每个都是 5x5 对象:

set.seed(1)
x <-as.data.frame(matrix(rnorm(10),ncol=5,nrow=5))
colnames(x) <-c("a","b","c","d","e")

y <-as.data.frame(matrix(rnorm(10),ncol=5,nrow=5))
colnames(y) <-c("f","g","h","i","j")

z <-as.data.frame(matrix(rnorm(10),ncol=5,nrow=5))
colnames(z) <-c("k","l","m","n","o")

因此,例如,x 看起来像:

  > x
           a          b          c          d          e
1 -0.6264538 -0.8204684 -0.6264538 -0.8204684 -0.6264538
2  0.1836433  0.4874291  0.1836433  0.4874291  0.1836433
3 -0.8356286  0.7383247 -0.8356286  0.7383247 -0.8356286
4  1.5952808  0.5757814  1.5952808  0.5757814  1.5952808
5  0.3295078 -0.3053884  0.3295078 -0.3053884  0.3295078

如何有效地计算每个数据框中同一位置的 3 个值的跨行均值?例如,计算数据帧第 1 行/第 1 列中 3 个值的平均值。当然,手动操作很容易。例如:

> mean(c(x$a[1],y$f[1],z$k[1]))
[1] 0.6014349

> mean(c(x$b[1],y$g[1],z$l[1]))
[1] -0.3071769

...等等。但是对于更大的数据帧,我怎样才能在 R 中有效地做到这一点呢?我试过 mapply() 和 apply() 和 sweep() 的变体,但没有成功。我知道有一个简单的解决方案,但我有脑锁。任何帮助将不胜感激!

您可以将数据帧转换为矩阵,计算均值,然后将均值矩阵转换回数据帧格式。这是代码:

xx <- data.matrix(x)
yy <- data.matrix(y)
zz <- data.matrix(z)
mm <- (xx+yy+zz)/3
mean.df <- data.frame(mm)

我觉得我必须提供我的简单解决方案作为答案...

(x+y+z)/3

另一个方法:

rowMeans(sapply(list(x, y, z), function(x) unlist(x, use.names=FALSE)))

或者,以更快的速度恢复 5x5 结构 .rowMeans

rc <- dim(x)
d <- list(x, y, z)
r <- .rowMeans(sapply(d, function(x) unlist(x, use.names=FALSE)), prod(rc), length(d))
m <- matrix(r, nrow=rc[1])

这是在保持矩阵输出的同时对其进行概括的一种方法:

apply(sapply(list(x,y,z), as.matrix, simplify="array"), 1:2, mean)
#              a           b          c           d          e
#[1,]  0.6014349 -0.30717691  0.6014349 -0.30717691  0.6014349
#[2,]  0.4518743  0.10514776  0.4518743  0.10514776  0.4518743
#[3,] -0.4607681  0.07046951 -0.4607681  0.07046951 -0.4607681
#[4,] -0.8695903  0.30628416 -0.8695903  0.30628416 -0.8695903
#[5,]  0.6914215  0.23548483  0.6914215  0.23548483  0.6914215