Значения, замененные на na, по-прежнему отображаются в summary()

#r #tidyr

Вопрос:

Это упрощенная версия кода:

 # Packages used
pkg <- c("tidyverse",
         "synthpop"
)

tmp1 <- read_csv2(file1)
tmp2 <- read_csv2(file2) 
tmp <- tmp1 %>%
    left_join(tmp2) 
 

У меня была проблема с тем, что там были как значения na, так и текстовые значения NA (которые были получены из файла csv). Чтобы решить эту проблему, я заменил текстовые NA на фактические na, см. Ниже.

 # replacing textual "NA"'s with actual na's that are regonized by R 
tmp <- na_if(tmp, "NA")
 

Однако при запуске:

 summary(tmp["Region"])
 

Вывод:

 Region      
 North:19342  
 West :91234  
 East :48001  
 South:43347  
 NA   :    0  
 NA's :12276  
 

Он по-прежнему отображает текстовый NA как категорию, хотя и со счетом 0 (это делается для всех переменных в tmp). Из-за этого я столкнулся с проблемами позже в своем коде. Я бы хотел, чтобы текстовый NA больше не существовал (речь идет не о выводе, а о фактическом существовании NA как фактора, я синтезирую набор данных позже, и NA и NA не следует воспринимать как две отдельные возможности).

Какова альтернатива или дополнение к: tmp <- na_if(tmp, "NA") , чтобы эта проблема не возникала? Я надеюсь, что вы сможете мне помочь!

Комментарии:

1. Чтобы помочь, нам действительно нужно увидеть ваши данные. Пожалуйста, укажите выходные данные из dput(tmp) или dput(head(tmp)) .

2. является ли область a factor с уровнем, называемым «NA»? что происходит с summary(droplevels(tmp["Region"]))

3. К сожалению, я не могу показать какие-либо данные из-за правил.

4. К сожалению, droplevels не работает, поскольку речь идет не о сводном выводе. Вывод просто показывает, что NA по-прежнему относится к другой категории, чем NA, что впоследствии приводит к проблемам.

5. Как вы использовали droplevels ? Попробуйте tmp <- droplevels(tmp) , а затем выполните summary(tmp["Region"]) . Что это вам дает?

Ответ №1:

forcats::fct_drop удалит неиспользуемые уровни в коэффициенте:

 library(tidyverse)

df <- tribble(~a, "a", "b", "c", "NA", NA) %>% 
  mutate(a = as_factor(a))

df2 <- na_if(df, "NA") %>% 
  mutate(a = fct_drop(a))

summary(df2)
#>     a    
#>  a   :1  
#>  b   :1  
#>  c   :1  
#>  NA's:2
 

Создано 2021-10-26 пакетом reprex (v2.0.0)

base::droplevels Функция, предложенная выше в комментариях, делает то же самое, конечно! Тем не менее, мне очень нравится forcats пакет для привыкания к обработке факторов и уровней.