У меня есть следующая матрица 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() перезаписывает строку моей новой матрицы?





Вы не должны итеративно добавлять / 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
}
Но все это следует заменить на подмножество.
Большое спасибо, что наконец-то сработало. и, как вы отметили, подмножество кажется более практичным, поэтому я буду использовать это в будущем