【问题标题】:Calculate the average per row per set of columns计算每行每列的平均值
【发布时间】:2015-08-06 16:21:56
【问题描述】:

我想要做的是以下,给定一个矩阵,例如:mat <- matrix(1:100, nrow = 4) 和一组列组合c_w <- combn(c(1,2,3,4), 2)。我想计算每个组合的平均值。所以对于第一个组合,我们有rowMeans(mat[,c_w[,1]]),对于第二个rowMeans(mat[,c_w[,2]])。到目前为止一切顺利,我可以将它包装在一个 for 循环中,然后使用 row combine 将结果组合成一个很好的结果矩阵。然而问题是性能,如果可能的话,我想以矢量化的方式来做这件事。所以我的问题是:

我们可以在 R 代码中不使用 for 循环吗?

编辑 我希望它以矩阵形式出现,其中每列代表每组的平均值。然而,这也可以通过对 Arun 的代码进行一些小的添加来实现。请把评论变成答案,以便我给你加分:)。

谢谢

【问题讨论】:

  • 我认为数组方法要快一点。

标签: r matrix


【解决方案1】:

我们可以使用combn 中的FUN 参数直接在combn 步骤中使用从combn 派生的列索引对'mat' 的列进行子集化后执行rowMeans

 combn(1:4, 2, FUN=function(x) rowMeans(mat[,x]))
 #    [,1] [,2] [,3] [,4] [,5] [,6]
 #[1,]    3    5    7    7    9   11
 #[2,]    4    6    8    8   10   12
 #[3,]    5    7    9    9   11   13
 #[4,]    6    8   10   10   12   14

或者如果我们得到combn 输出的另一个选项是通过'c_w' 的colsplit 并使用sapply 循环遍历'list' 元素,使用数字子集'mat'索引并获取rowMeans

 sapply(split(c_w, col(c_w)), function(x) rowMeans(mat[,x]))
 #     1 2  3  4  5  6
 #[1,] 3 5  7  7  9 11
 #[2,] 4 6  8  8 10 12
 #[3,] 5 7  9  9 11 13
 #[4,] 6 8 10 10 12 14

或者第三种方法是连接(c),来自c_w 的列索引并使用它来获取“mat”的列,创建具有指定尺寸的array。在这里,我们知道 4 是 'mat' 的行数,2 是在 combn6 中指定的 'm' 作为 'c_w' 的 ncol。循环使用apply,指定MARGIN为'3',得到rowMeans

 apply(array(mat[,c(c_w)], c(4,2,6)), 3, rowMeans)
 #      [,1] [,2] [,3] [,4] [,5] [,6]
 #[1,]    3    5    7    7    9   11
 #[2,]    4    6    8    8   10   12
 #[3,]    5    7    9    9   11   13
 #[4,]    6    8   10   10   12   14

或者正如@A.Webb 提到的,apply 对于像c_w 这样的矩阵会更自然

 apply(c_w,2,function(i) rowMeans(mat[,i]))

【讨论】:

  • apply(c_w,2,function(i) rowMeans(mat[,i])) 至少对我来说更清楚一些。
猜你喜欢
  • 2019-04-03
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2020-08-09
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多