【问题标题】:Values replaced with na, are still shown in summary()替换为 na 的值,仍然显示在 summary() 中
【发布时间】:2021-10-26 09:21:39
【问题描述】:

这是代码的简化版本:

# 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 &lt;- na_if(tmp, "NA"),以免出现此问题?我希望你能帮助我!

【问题讨论】:

  • 为了提供帮助,我们确实需要查看您的数据。请提供来自dput(tmp)dput(head(tmp)) 的输出。
  • 区域是否为factor,级别为“NA”? summary(droplevels(tmp["Region"])) 会发生什么
  • 很遗憾,由于法规,我无法显示任何数据。
  • 很遗憾,droplevels 不起作用,因为它与摘要输出无关。输出仅表明 NA 仍然是与 NA 不同的类别,这会在以后带来问题。
  • 您是如何使用droplevels 的?尝试tmp &lt;- droplevels(tmp),然后执行summary(tmp["Region"])。这给了你什么?

标签: r tidyr


【解决方案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

reprex package (v2.0.0) 于 2021 年 10 月 26 日创建

上面在 cmets 中建议的 base::droplevels 函数当然也是一样的!我非常喜欢 forcats 包,因为它习惯于处理因子和水平。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多