Double for loop с ifelse() не работает должным образом в R

Я пытаюсь просмотреть каждый столбец моего фрейма данных и преобразовать "неизвестные" значения в NA. Я попробовал следующий код:

for (i in seq(length(df))) {
 for (j in seq(nrow(df))) {
      ifelse(df[,i][j] == "unknown", NA, df[,i][j])
 }
}

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

for (i in seq(length(df))) {
 x <- class(df[,i])
 as.character(df[,i])
 for (j in seq(nrow(df))) {
      ifelse(df[,i][j] == "unknown", NA, df[,i][j])
 }
 class(df[,i]) <- x
}

но безрезультатно. Ошибка не получена, и кажется, что код работает без проблем; только значения остаются как "неизвестно".

2 ответа

Решение

Мы можем попробовать:

df[df == "unknown"] = NA

Это предполагает, что все ваши столбцы являются символами, а не фактором.

Запуск ifelse не меняет значения ни одного из его аргументов. Вы должны были бы присвоить результат обратно в столбец df, И делать это по строкам не имеет никакого смысла, потому что ifelse предназначен для использования в векторе, поэтому вместо этого это может быть:

for (i in seq(length(df))) {
       df[,i] <- ifelse(df[,i] == "unknown", NA, df[,i] )
 }
}

Что по-прежнему не является оптимальным в свете гораздо более эффективной стратегии, показанной @TimBiegeleisen, но, по крайней мере, вы можете изучить это, чтобы узнать, как улучшить ваше понимание использования forпетли и ifelse при использовании R.

Другие вопросы по тегам