#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.