【问题标题】:How to make sure 'NA' is "not" the last factor level?如何确保“NA”“不是”最后一个因素水平?
【发布时间】:2020-02-29 13:47:15
【问题描述】:

因子函数的文档指出:

因子的代码可能包含NA。对于数字 x,设置 exclude = NULL 使 NA 成为一个额外的级别(打印为 ); 默认情况下,这是 最后一级。

我不想要这个。

我目前的数据是这样的:

我希望根据组内大小对我的因子水平进行排序,其中包括我对 NA 值的观察。有没有办法做到这一点?

到目前为止,我已经尝试将我的 NA 值重命名为其他东西(使用 ifelse() 和 is.na())因子函数中的 exclude=NULL 选项)和 addNA 函数。

我当前的代码(我创建了一个排序表,然后根据它对因子水平进行排序):

vettig_tabell<-table(fulldata$gymnasiegrov,fulldata$totstatus_tri, exclude=NULL)
vettig_tabell<-as.data.frame(vettig_tabell)
vettig_tabell<-spread(vettig_tabell, Var2, Freq)
vettig_tabell<-vettig_tabell%>%mutate(ongoing=`pågående studier`/(`pågående studier` + `tidigt avbrott eller återbud` + `troligt avbrott`))

#sorting by relative frequency#

vettig_tabell<-vettig_tabell%>%arrange(ongoing)

#Trying to use order of programmes sorted on relative frequency as factor levels#

fulldata$gymnasiegrov<-factor(fulldata$gymnasiegrov, , exclude=NULL levels=vettig_tabell$Var1, ordered=TRUE)

fulldata %>%
    as_tibble() %>%
    group_by(gymnasiegrov, totstatus_tri) %>% 
    summarise(antal = n()) %>% 
    mutate(andel = antal / sum(antal))%>% 
    ggplot(.) + 
    geom_col(mapping = aes(x = gymnasiegrov, y = andel)) + 
    coord_flip() + 
    facet_wrap(~totstatus_tri)

数据摘录:

structure(list(gymnasiegrov = c("Hotell- och Restaurang", NA, 
"specialutformat program", "komvux", NA, "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"estetiska programmet", "komvux", "naturvetenskapliga programmet", 
NA, "specialutformat program", "estetiska programmet", "medieprogrammet/medieproduktion", 
"specialutformat program", "specialutformat program", "komvux", 
"estetiska programmet", "samhällsvetenskapliga programmet", "specialutformat program", 
"friskoleprogram", "teknikprogrammet", "specialutformat program", 
"teknikprogrammet", "Handels- och administrationsprogrammet", 
"Hotell- och Restaurang", "samhällsvetenskapliga programmet", 
"samhälls- och ekonomiprogrammet", "specialutformat program", 
"komvux", "specialutformat program", "specialutformat program", 
"bygg, el, fordon, hantverk, sjöfart, industriteknik", "komvux", 
"Handels- och administrationsprogrammet", "teknikprogrammet", 
"teknikprogrammet", "friskoleprogram", "specialutformat program", 
"naturvetenskapliga programmet", "naturvetenskapliga programmet", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "samhällsvetenskapliga programmet", 
"Hotell- och Restaurang", "specialutformat program", "samhällsvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "komvux", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"estetiska programmet", "estetiska programmet", "samhällsvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"naturvetenskapliga programmet", "Handels- och administrationsprogrammet", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"bygg, el, fordon, hantverk, sjöfart, industriteknik", "ekonomiprogrammet/ juridik", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "bygg, el, fordon, hantverk, sjöfart, industriteknik", 
"ekonomiprogrammet/ ekonomi", "Handels- och administrationsprogrammet", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "estetiska programmet", 
"ekonomiprogrammet/ ekonomi", "teknikprogrammet", "samhällsvetenskapliga programmet", 
"naturvetenskapliga programmet", "naturvetenskapliga programmet", 
"teknikprogrammet", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "samhällsvetenskapliga programmet", 
"samhällsvetenskapliga programmet", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "samhällsvetenskapliga programmet", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ juridik", 
"teknikprogrammet", "teknikprogrammet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"naturvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", 
"teknikprogrammet", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "naturvetenskapliga programmet", 
"ekonomiprogrammet/ juridik", "naturvetenskapliga programmet", 
"teknikprogrammet", "ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"samhällsvetenskapliga programmet", "estetiska programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ ekonomi", "teknikprogrammet", 
"naturvetenskapliga programmet", "ekonomiprogrammet/ ekonomi", 
"ekonomiprogrammet/ ekonomi", "ekonomiprogrammet/ juridik", "ekonomiprogrammet/ ekonomi", 
NA, NA, NA, NA, NA, NA, NA, NA), totstatus_tri = c("troligt avbrott", 
"tidigt avbrott eller återbud", "pågående studier", "troligt avbrott", 
"troligt avbrott", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"tidigt avbrott eller återbud", "pågående studier", "tidigt avbrott eller återbud", 
"tidigt avbrott eller återbud", "pågående studier", "pågående studier", 
"troligt avbrott", "pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"troligt avbrott", "tidigt avbrott eller återbud", "pågående studier", 
"pågående studier", "pågående studier", "troligt avbrott", "troligt avbrott", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "tidigt avbrott eller återbud", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"pågående studier", "tidigt avbrott eller återbud", "tidigt avbrott eller återbud", 
"tidigt avbrott eller återbud", "tidigt avbrott eller återbud", 
"pågående studier", "troligt avbrott", "tidigt avbrott eller återbud", 
"pågående studier", "tidigt avbrott eller återbud", "pågående studier", 
"troligt avbrott", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "tidigt avbrott eller återbud", "pågående studier", 
"pågående studier", "tidigt avbrott eller återbud", "pågående studier", 
"pågående studier", "tidigt avbrott eller återbud", "tidigt avbrott eller återbud", 
"tidigt avbrott eller återbud", "pågående studier", "troligt avbrott", 
"tidigt avbrott eller återbud", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"tidigt avbrott eller återbud", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "tidigt avbrott eller återbud", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"troligt avbrott", "troligt avbrott", "pågående studier", "pågående studier", 
"tidigt avbrott eller återbud", "pågående studier", "tidigt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"pågående studier", "troligt avbrott", "tidigt avbrott eller återbud", 
"pågående studier", "pågående studier", "troligt avbrott", "pågående studier", 
"pågående studier", "tidigt avbrott eller återbud", "tidigt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "troligt avbrott", 
"pågående studier", "tidigt avbrott eller återbud", "pågående studier", 
"tidigt avbrott eller återbud", "troligt avbrott", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "troligt avbrott", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"pågående studier", "pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"troligt avbrott", "pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"tidigt avbrott eller återbud", "pågående studier", "pågående studier", 
"troligt avbrott", "troligt avbrott", "pågående studier", "tidigt avbrott eller återbud", 
"tidigt avbrott eller återbud", "pågående studier", "troligt avbrott", 
"pågående studier", "pågående studier", "tidigt avbrott eller återbud", 
"pågående studier", "pågående studier", "pågående studier", "pågående studier", 
"troligt avbrott", "pågående studier", "pågående studier", "pågående studier"
)), class = "data.frame", row.names = c(NA, -162L))

  [1]: https://i.stack.imgur.com/i6emH.png

【问题讨论】:

  • 我可以用两个相关变量摘录 :)
  • 如果有帮助,我可以在应用因子函数并尝试对其进行排序之前共享未更改的数据。
  • 我认为你应该这样做。因为现在完整数据中的 NA,它们可能来自您的因式分解
  • 是的,想想看,我看不出“不”这样做的原因。我将立即更换 dput。

标签: r na


【解决方案1】:

一个简单的解决方案是在开始时替换 fulldata 中的 NA。我在我的例子中使用了“缺失”。由于这是一个开始的因素,您需要将其转换为字符,然后使用 replace_NA

fulldata <- fulldata %>% mutate(gymnasiegrov=replace_na(as.character(gymnasiegrov),"Missing"))

然后你做制表..

    vettig_tabell<-table(fulldata$gymnasiegrov,fulldata$totstatus_tri, exclude=NULL)
    vettig_tabell<-as.data.frame(vettig_tabell)
    vettig_tabell<-spread(vettig_tabell, Var2, Freq)
    vettig_tabell<-vettig_tabell%>%mutate(ongoing=`pågående studier`/(`pågående studier` + `tidigt avbrott eller återbud` + `troligt avbrott`))

#sorting by relative frequency#

vettig_tabell<-vettig_tabell%>%arrange(ongoing)

尝试使用按相对频率排序的程序顺序作为因子水平

然后你再考虑gymnsiegrov

fulldata$gymnasiegrov<-factor(fulldata$gymnasiegrov,levels=vettig_tabell$Var1, ordered=TRUE)

还有情节:

【讨论】:

  • 谢谢!我之前尝试过类似的东西并写了 test$gymnasiegrov
  • 我猜你没有将列转换为字符?如果您尝试将新字符串引入因子,它会再次变为 NA :)
  • 哦,是的,还有一件事,你不能像那样使用 ifelse。它应该是 test$gymnasiegrov[is.na(test$gymnasiegrov)]
【解决方案2】:

这是一种方法:

library(tidyverse)

fulldata %>%
  as_tibble() %>%
  group_by(gymnasiegrov, totstatus_tri) %>% 
  summarise(antal = n()) %>% 
  mutate(andel = antal / sum(antal)) %>%
  ungroup %>%
  replace_na(list(gymnasiegrov = 'NA')) %>%
  arrange(desc(andel)) %>%
  mutate(gymnasiegrov = factor(gymnasiegrov, levels = unique(gymnasiegrov))) %>%
  ggplot() + 
  geom_col(mapping = aes(x = gymnasiegrov, y = andel)) + 
  coord_flip() + 
  facet_wrap(~totstatus_tri)

【讨论】:

    猜你喜欢
    • 2021-02-21
    • 2020-09-29
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多