通过包含不完整索引的向量对矩阵的行重新排序

时间:2016-03-21 16:16:17

标签: r matrix

我有一个数据矩阵:

> matrix <- matrix(rnorm(16), ncol=4)
> matrix
           [,1]       [,2]       [,3]        [,4]
[1,] -0.9239653  0.4217107 -0.3092167  0.09732866
[2,] -0.9635737  0.3755872 -0.4033848  1.67775919
[3,]  1.1193376 -0.3618842 -1.0036277 -0.50638047
[4,] -0.2659838 -0.8215967  0.1611249 -0.05114933

我想通过向量中指定的索引重新排序矩阵的行。如果索引中的数字对应于矩阵中的行号,这很容易:

> index <- c(3, 2, 1, 4)
> reordered.matrix <- matrix[index, ]
> reordered.matrix
           [,1]       [,2]       [,3]        [,4]
[1,]  1.1193376 -0.3618842 -1.0036277 -0.50638047
[2,] -0.9635737  0.3755872 -0.4033848  1.67775919
[3,] -0.9239653  0.4217107 -0.3092167  0.09732866
[4,] -0.2659838 -0.8215967  0.1611249 -0.05114933

然而,在现实生活中,我的索引包含一些零。这些零指定我想要丢弃数据的位置,即在该行中只有一行零或NA。这是我想得到的:

> index <- c(3, 0, 1, 0)
> reordered.matrix <- matrix[index, ]
> reordered.matrix
           [,1]       [,2]       [,3]        [,4]
[1,]  1.1193376 -0.3618842 -1.0036277 -0.50638047
[2,]          0          0          0           0  
[3,] -0.9239653  0.4217107 -0.3092167  0.09732866
[4,]          0          0          0           0

但是R忽略了零,我得到了:

           [,1]       [,2]       [,3]        [,4]
[1,]  1.1193376 -0.3618842 -1.0036277 -0.50638047
[2,] -0.9239653  0.4217107 -0.3092167  0.09732866

一种可能的解决方案是编写一个循环,逐个遍历索引,复制数据并将其写入新矩阵的正确位置。但是,我使用的矩阵很大(数百万行),循环太慢。有没有什么方法可以得到我想要的东西而不需要求助于循环?

1 个答案:

答案 0 :(得分:1)

我们可以替换&#39;指数&#39;中的0&#39;使用NA并使用它来排序矩阵行。

m1 <- matrix[(NA^!index)*index,]
replace(m1, is.na(m1), 0)
#            [,1]       [,2]       [,3]        [,4]
#[1,]  1.1193376 -0.3618842 -1.0036277 -0.50638047
#[2,]  0.0000000  0.0000000  0.0000000  0.00000000
#[3,] -0.9239653  0.4217107 -0.3092167  0.09732866
#[4,]  0.0000000  0.0000000  0.0000000  0.00000000

注意:最好不要将matrix对象称为matrix