R: замена в факторных переменных как 0

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