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.