首页 > 解决方案 > 替换为 na 的值,仍然显示在 summary() 中

问题描述

这是代码的简化版本:

# 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"),这样就不会发生这个问题?我希望你能帮帮我!

标签: rtidyr

解决方案


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

reprex 包于 2021-10-26 创建 (v2.0.0 )

base::droplevels上面在评论中建议的功能当然是一样的!不过,我非常喜欢forcats习惯于处理因素和水平的软件包。


推荐阅读