2016-03-21 39 views
1

我有數據的矩陣:行乘以一個向量含一個不完整的索引

> 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 

但是,在現實生活中,我的索引包含一些零。這些零指定我想放棄數據的位置,即在該行中只有一行零或NAs。以下是我想獲得:

> 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

我們可以用NA代替'index'中的0,並用它來排序矩陣的行。

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

+1

謝謝Akrun,這工作。 –