r - 如何使用 forcats::fct_explicit_na() 替换 data.frame 中的所有 <NA> 值?

标签 r tidyverse forcats

我有一个包含 19 个变量的数据框,其中 17 个是因子。其中一些因素包含缺失值,编码为 NA。我想使用 forcats::fct_explicit_na() 将数据框中所有因素的缺失重新编码为单独的因素级别“to_impute”。

带有两个因子变量的小示例:

df <- structure(list(loc_len = structure(c(NA, NA, NA, NA, NA, NA, 
1L, 1L, 3L, 1L), .Label = c("No", "< 5 sec", "5 sec - < 1 min", 
"1 - 5 min", "> 5 min", "Unknown duration"), class = "factor"), 
    AMS = structure(c(1L, 2L, NA, 1L, 1L, NA, NA, NA, NA, NA), .Label = c("No", 
    "Yes"), class = "factor")), .Names = c("loc_len", "AMS"), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

table(df$loc_len, useNA = "always")

              No          < 5 sec  5 sec - < 1 min        1 - 5 min          > 5 min Unknown duration             <NA> 
               3                0                1                0                0                0                6 

下面的代码对两个变量执行此操作。我想对数据框中的所有因子变量“f_names”执行此操作。有没有办法“矢量化”fct_explicit_na()?

f_names <- names(Filter(is.factor, df))

 f_names
[1] "loc_len" "AMS"

下面的代码实现了我想要的功能,但针对每个因素分别进行了处理:

df_new <- df  %>% 
                    mutate(loc_len = fct_explicit_na(loc_len, na_level = "to_impute")) %>% 
                    mutate(AMS = fct_explicit_na(AMS, na_level = "to_impute"))

我想要数据集中所有因素的此类表格,名称在“f_names”中:

lapply(df_new, function(x) data.frame(table(x, useNA = "always")))

现在是:

$loc_len
                 x Freq
1               No    3
2          < 5 sec    0
3  5 sec - < 1 min    1
4        1 - 5 min    0
5          > 5 min    0
6 Unknown duration    0
7        to_impute    6
8             <NA>    0

$AMS
          x Freq
1        No    3
2       Yes    1
3 to_impute    6
4      <NA>    0

最佳答案

更好的是,以下提供的优雅且惯用的解决方案:

https://github.com/tidyverse/forcats/issues/122

library(dplyr)
df = df %>% mutate_if(is.factor,
                      fct_explicit_na,
                      na_level = "to_impute")

关于r - 如何使用 forcats::fct_explicit_na() 替换 data.frame 中的所有 <NA> 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49338118/

相关文章:

r - 在R中如何将经度和纬度转换为可在ggplot2或ggmap中使用的格式

r - 如何使用 stat_bin2d() 计算 ggplot2 中的计数标签?

r - 创建具有均值和置信区间的 ggplot

R:转换为与 case_when 相同的级别顺序的因子

r - 如何删除数据框中的 "Not Available"

r - 将分布拟合到 R 中的给定频率值

r - dplyr:使用 poly 函数生成多项式系数

值在错误列中的 R 数据框

r - 基于以某个字符开头的级别的自动重构?

r - 在另一个级别之后更改一个因素的级别