rbind () перезаписывает строки матрицы в цикле - PullRequest
0 голосов
/ 31 октября 2018

У меня есть следующая матрица "myMatrix2":

    [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
[4,]    1    2    3

Теперь я хочу написать функцию, которая помещает все строки, начинающиеся со значения 1, в новую матрицу.

Вот что я придумал:

retrieverows_2 <- function(matrixold, y=1){
  matrixnew <<- matrix()
  while(y<=nrow(matrixold)){
    if(matrixold[y,1]==1){
     matrixnew <<- rbind(matrixold[y,])
    }
  y <- y+1
  }
}

Проблема теперь в том, что кажется, что она перезаписывает строку новой матрицы, так что она возвращает только последнюю строку моей исходной матрицы следующим образом:

     [,1] [,2] [,3]
[1,]    1    2    3

Мой желаемый результат был бы:

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    1    2    3

Может кто-нибудь объяснить мне, почему rbind() перезаписывает строку моей новой матрицы?

1 Ответ

0 голосов
/ 31 октября 2018

Вы не должны итеративно добавлять / rbind для простых сценариев, подобных этому. Вместо этого используйте подмножество:

m <- matrix(c(1,2,3,1,4,5,6,2,7,8,9,3), nrow = 4, ncol = 3)
newmat <- m[which(m[,1] == 1),]
#     [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    1    2    3

Что касается ПОЧЕМУ ваш код возвращает только одну строку, вы каждый раз переписываете newmatrix. Вам нужно создать счетчик, чтобы отслеживать новые строки. Что-то вроде

  count = 0
  while(y<=nrow(matrixold)){
    if(matrixold[y,1]==1){
      count = count + 1
      matrixnew[count,] <<- rbind(matrixold[y,])
    }
    y <- y+1
  }

Но все это должно быть заменено поднабором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...