用rowmean替换所有行

时间:2013-07-26 17:05:34

标签: r

我有一个包含4列的矩阵,我已经对矩阵进行了排序,并为每一行计算了rowMeans。现在我想用原来的rowMeans替换原始矩阵中的所有值。 c5sub是具有4列

的矩阵
sortmat<-apply(c5sub, 2, sort) # sorted matrix by column
[1,]                     -7                     -6                    -17                     -6
[2,]                     -7                     -6                     -9                     -6
[3,]                     -6                     -5                     -8                     -6
[4,]                     -6                     -5                     -8                     -6
[5,]                     -6                     -5                     -7                     -6
[6,]                     -6                     -5                     -7                     -5

rwmeans<-apply(sortmat, 1, mean)# calculated rowmeans 
-9.00 -7.00 -6.25 -6.25 -6.00 -5.75

(a <- sweep(a,1,rwmeans,function(x,y) ifelse(x!=0,y,0)))
[1,]                  -9.00                  -9.00                  -9.00                  -9.00
[2,]                  -7.00                  -7.00                  -7.00                  -7.00
[3,]                  -6.25                  -6.25                  -6.25                  -6.25
[4,]                  -6.25                  -6.25                  -6.25                  -6.25
[5,]                  -6.00                  -6.00                  -6.00                  -6.00
[6,]                  -5.75                  -5.75                  -5.75                  -5.75

我使用上面的一个用rowMeans替换原始值,但它没有替换零,因为我有ifelse。如何修改它以替换所有值?

2 个答案:

答案 0 :(得分:1)

保留sortmat的原始属性,例如行名和列名:

sortmat[] <- rowMeans(sortmat)

这是因为1)R中的矩阵以列主顺序存储,表示第1列中的所有值,后面是第2列中的所有值,依此类推; 2)向量被回收,因此rowmeans的向量被复制到正确的长度以进行分配; 3)在LHS []上用空括号赋值意味着“替换对象中的所有元素,但保留对象本身”。

答案 1 :(得分:0)

我认为这里的问题是试图逐字地替换所有的值,而不是试图简单地创建OP所需的最终矩阵。

一旦计算了行平均值,并且已知最终矩阵的大小,我们可以像这样创建矩阵a

a <- matrix(rwmeans, nrow=length(rwmeans), ncol=Nc)

其中'rwmeans'包含带有列平均值的数组,'Nc'是最终矩阵中的列数。对于矩阵的每一列,将重复'rwmeans'中的值。