如何跨三个多列数据帧的行计算均值?
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
假设我有 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