0

我有一个 4 列的矩阵,我对矩阵进行了排序并计算了rowMeans每一行的矩阵。现在我想用相应的替换原始矩阵中的所有值rowMeansc5sub是 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. 如何修改它以替换所有值?

4

2 回答 2

1

sortmat要保留行和列名等原始属性:

sortmat[] <- rowMeans(sortmat)

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

于 2013-07-26T17:33:51.823 回答
0

我认为这里的问题在于尝试从字面上替换所有值,而不是尝试简单地创建 OP 所需的最终矩阵。

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

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

其中“rwmeans”包含一个具有列均值的数组,“Nc”是最终矩阵中的列数。'rwmeans' 中的值将针对矩阵的每一列重复。

于 2013-07-26T17:17:36.030 回答