#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
пакет для привыкания к обработке факторов и уровней.