我有一个包含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
。如何修改它以替换所有值?
答案 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'中的值。