我想要做的是给定矩阵,例如: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代码的一些小的补充来实现。请将评论转为答案,以便我给你积分:)。
由于
答案 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;在array
和combn
中指定为&#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