разница в поведении if else и ifelse в цикле for

#r #for-loop

#r #for-цикл

Вопрос:

Я пытаюсь выполнить a for loop , чтобы заменить NA значения на ноль в некоторых столбцах a data.frame . Вот пример моих данных:

 data <- structure(list(x1 = c(441, 457, 455, 475, 490, 547, 21, 17, 16, 
26), x2 = c(25, 28, 24, 20, 21, 28, 0, 1, 0, 1), x3 = c(3, 1, 
2, 2, 0, 2, 0, 0, 0, 0), x4 = c(0, 1, NA, NA, NA, NA, 0, 0, 0, 
0), x5 = c(1, 2, 2, 5, 2, 0, 0, 0, NA, NA)), row.names = c(NA, 
10L), class = "data.frame")
 

Применение if else к for loop работам:

 for (i in 1:5) {
  for (j in 1:nrow(data)) {
    if(is.na(data[j,i])){
      data[j,i] = 0 
    } else {
      data[j,i] =  data[j,i]
    }
  }
}
 

Но когда я применяю ifelse в for loop , это не работает:

 for (i in 1:5) {
      for (j in 1:nrow(data)) {
        ifelse(is.na(data[j,i]), 0, data[j,i])
      }
}
 

Может ли кто-нибудь помочь мне понять разницу в поведении этих функций? Премного благодарен.

Ответ №1:

Вы можете попробовать replace is.na для повышения эффективности

 data <- replace(data,is.na(data),0)
 

такой , что

 > data
    x1 x2 x3 x4 x5
1  441 25  3  0  1
2  457 28  1  1  2
3  455 24  2  0  2
4  475 20  2  0  5
5  490 21  0  0  2
6  547 28  2  0  0
7   21  0  0  0  0
8   17  1  0  0  0
9   16  0  0  0  0
10  26  1  0  0  0
 

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

1. Я всегда забываю о replace функции

Ответ №2:

вам нужно присвоить результат чему-то:

 for (i in 1:5) {
      for (j in 1:nrow(data)) {
        data[j, i] <- ifelse(is.na(data[j,i]), 0, data[j,i])
      }
}
 

Однако обратите внимание, что использование двух for loops не является лучшей практикой в вашем случае.
Немедленным улучшением было бы следующее:

 for (i in 1:5) {
    data[, i] <- ifelse(is.na(data[ ,i]), 0, data[ ,i])
}
 

Еще лучше: вы можете использовать tidyverse пакет:

 library(tidyverse)
data <- mutate(data, across(everything, ~if_else(is.na(.x), 0, .x)))
 

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

1. Спасибо @Cettt, мне не хватало внимания.

2. когда я пытаюсь использовать альтернативу tidyverse , у меня появляется ошибка, @Cettt.