【问题标题】:How to calculate means across rows of three multi-column dataframes?如何跨三个多列数据框的行计算均值?
【发布时间】:2015-10-08 22:24:39
【问题描述】:

假设我有 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() 的变体,但没有运气。我知道有一个简单的解决方案,但我有脑锁定。任何帮助将不胜感激!

【问题讨论】:

  • 所以你想要25个手段?
  • 理查德,是的,25 的意思是——一个 5x5 的矩阵。

标签: r apply mapply


【解决方案1】:

我觉得我必须提供我的微不足道的解决方案作为答案......

(x+y+z)/3

【讨论】:

  • Martin,这行得通 - 以及为简单起见和维护数据帧格式的额外要点。谢谢!我怎么会错过这个?
  • 嗯,有时你必须退后一步才能看到简单的事情;)
【解决方案2】:

您可以将数据框转换为矩阵、计算均值并将均值矩阵转换回数据框格式。代码如下:

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

【讨论】:

  • data.frames 如果尺寸相同,则可以相加等。无需matrix 转换
【解决方案3】:

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

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

【讨论】:

  • apply(sapply() 解决方案很有趣。记住相关工作很有用。谢谢。
【解决方案4】:

另一种方法:

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])

【讨论】:

  • RobertH,5x5 结构不成立。有修改吗?
  • 添加了将值放回矩阵的替代方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多