计算每组列的每行平均值

时间:2015-08-06 16:21:57

标签: r matrix

我想要做的是给定矩阵,例如: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循环中,然后使用行组合将结果组合成一个漂亮的结果矩阵。然而问题是性能,如果可能的话,我想以矢量化的方式做到这一点。所以我的问题是:

我们可以在R代码中没有for循环吗?

修改 我希望以Matrix格式表示,其中每列代表每组的平均值。然而,这也可以通过对Arun代码的一些小的补充来实现。请将评论转为答案,以便我给你积分:)。

由于

1 个答案:

答案 0 :(得分:2)

我们可以使用FUN中的combn参数在rowMeans步骤中直接在combn步骤中对combn进行子集化。列索引派生自 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

如果我们获得split输出,则另一个选项是col的{​​{1}}&#39; c_w&#39;并循环显示&#39;列表&#39;具有sapply的元素,其中包含了&#39; mat&#39;使用数字索引并获取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的列索引并使用它来获取&#39; mat&#39;的列,创建一个{{1} }具有指定的尺寸。在这里,我们知道4是&#39; mat的行数,2是&#39; m&#39;在arraycombn中指定为&#39; c_w&#39;的ncol。使用6循环,将MARGIN指定为&#39; 3&#39;,然后获取apply

rowMeans

或者正如@ A.Webb所提到的, 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 对于像apply

这样的矩阵更自然
c_w
相关问题