Замена NA в цикле for/if в R

#r

Вопрос:

Я сталкиваюсь с неожиданным вызовом в Р. В моем наборе данных в определенных столбцах есть NA. Некоторые из этих NAs ДОЛЖНЫ присутствовать (значения действительно отсутствуют), в то время как другие должны быть заменены на 0. Я использовал код, подобный следующему:

 df1 <- data.frame(x = c(1, 2, 3, 4, 5), y = c(10, 10, NA, NA, 12), z = c(9, 9, 9, 9, 9))
for (i in nrow(df1)){
  if(df1$x[i] > 3){
    df1$y[i] = 0
    df1$z[i] = 0
  }
}
 

И получил этот результат

   x  y z
1 1 10 9
2 2 10 9
3 3 NA 9
4 4 NA 9
5 5  0 0
 

NA ДОЛЖЕН быть сохранен в строке 3, но NA в строке 4 должен быть заменен на 0. Кроме того, значение z в строке 4 не обновлялось. Есть какие-нибудь идеи относительно того, что происходит?

Комментарии:

1. Я не знаю, насколько велик ваш реальный набор данных, но обратите внимание, что вы также можете найти replace() функцию полезной для этой задачи.

Ответ №1:

Вы использовали for i in nrow(df1) то, что соответствует for i in 5 . Я предполагаю , что вы хотели использовать for i in 1:nrow(df1) , что будет оценивать for i in 1:5 и включать все строки.

Комментарии:

1. Ах, вы совершенно правы! Огромное спасибо.

Ответ №2:

Не делайте этого таким образом, R-это не Python, вы получаете свои векторизованные функции из коробки:

 df1[df1$x > 3, c('y', 'z')] <- 0

df1

#   x  y z
# 1 1 10 9
# 2 2 10 9
# 3 3 NA 9
# 4 4  0 0
# 5 5  0 0