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

时间:2015-10-08 22:24:40

标签: r apply mapply

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

4 个答案:

答案 0 :(得分:4)

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

(x+y+z)/3

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

另一个apporach:

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

答案 3 :(得分: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
相关问题