#r #data-manipulation #na #missing-data
Вопрос:
Я работаю с языком программирования R. У меня есть набор данных как с символьными, так и с числовыми переменными — я пытаюсь заменить все NA и пустые значения в этих данных на «0». Для непрерывной переменной значение NA/empty должно быть заменено «числовым 0». Для факторных переменных значение NA/empty следует заменить на «коэффициент 0».
В прошлом я использовал стандартную команду для замены всех NA на 0 (в приведенном ниже коде «df» представляет фрейм данных, содержащий данные).:
df[df == NA] <- 0
Я попробовал приведенный выше код на своих данных, но все равно заметил, что в факторных переменных этот код не смог заменить <NA>
значения на 0. <NA>
Они все еще присутствуют.
Я попробовал несколько подходов:
1-й Подход:
df[is.na(df)] <- 0
Но это не сработало:
Warning message:
In '[<-.factor'('*tmp*',thisvar, value = 0):
invalid factor level, NA generated
Второй подход: я попробовал использовать одну из факторных переменных
library(car)
df$some_factor_var <- recode(df$some_factor_var, "NA = 0")
Но это заменило каждое значение в «some_factor_var» как 0
Третий подход : я попробовал еще раз для одной из факторных переменных
library(forcats)
fct_explicit_na(df$some_factor_var,0)
Error: Can't convert a double vector to a character vector
Может кто-нибудь, пожалуйста, показать мне, как решить эту проблему? Есть ли способ заменить ВСЕ пустые/отсутствующие/NA значения для всех переменных сразу?
Спасибо
Ответ №1:
С помощью tidyverse попробуйте:
library(tidyverse)
df <-
tibble(var_numeric = c(1,2,3,NA),
var_factor = as.factor(c(4,5,6,NA)))
df %>%
replace_na(list(var_numeric = 0)) %>%
mutate(var_factor = fct_explicit_na(var_factor, "0"))
# A tibble: 4 x 2
var_numeric var_factor
<dbl> <fct>
1 1 4
2 2 5
3 3 6
4 0 0
Комментарии:
1. Веласкес : Спасибо за ваш ответ!
Ответ №2:
Для факторных переменных вам необходимо сначала включить новый уровень (0) в данные, если он еще не присутствует.
Смотрите этот пример —
df <- data.frame(a = factor(c(1, NA, 2, 5)), b = 1:4,
c = c('a', 'b', 'c', NA), d = c(1, 2, NA, 1))
#Include 0 in the levels for "a" variable
levels(df$a) <- c(levels(df$a), 0)
#Replace NA to 0
df[is.na(df)] <- 0
df
# a b c d
#1 1 1 a 1
#2 0 2 b 2
#3 2 3 c 0
#4 5 4 0 1
str(df)
#'data.frame': 4 obs. of 4 variables:
# $ a: Factor w/ 4 levels "1","2","5","0": 1 4 2 3
# $ b: int 1 2 3 4
# $ c: chr "a" "b" "c" "0"
# $ d: num 1 2 0 1
Комментарии:
1. Спасибо вам за ваш ответ! вы все еще рекомендуете сначала запустить «df[df == NA]
2. Используйте
is.na
для постоянной проверкиNA
значений. Если выdf == NA
используете фрейм данных из моего ответа, вы увидите, что он возвращает всеNA
s.