如何替换所有<;NA>;使用forcats::fct_explicit_na()的data.frame中的值?
我有一个包含19个变量的数据框架,其中17个是因子。其中一些因子包含缺失值,编码为NA。我想使用forcats::fct_explicit_na()将缺失重新编码为一个单独的因子级别,用于数据框中的所有因子 有两个因素变量的小示例:如何替换所有<;NA>;使用forcats::fct_explicit_na()的data.frame中的值?,r,tidyverse,forcats,R,Tidyverse,Forcats,我有一个包含19个变量的数据框架,其中17个是因子。其中一些因子包含缺失值,编码为NA。我想使用forcats::fct_explicit_na()将缺失重新编码为一个单独的因子级别,用于数据框中的所有因子 有两个因素变量的小示例: df <- structure(list(loc_len = structure(c(NA, NA, NA, NA, NA, NA, 1L, 1L, 3L, 1L), .Label = c("No", "< 5 sec", "5 sec - <
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
现在是:
$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
$loc\u len
x频率
1号3号
2小于5秒0
3.5秒-<1分钟1
4 1-5分钟0
5>5分钟0
6未知持续时间0
7至6
8 0
$AMS
x频率
1号3号
2是的1
3至6
4 0
经过反复试验,下面的代码符合我的要求
library(tidyverse)
df[, f_names] <- lapply(df[, f_names], function(x) fct_explicit_na(x, na_level = "to_impute")) %>% as.data.frame
库(tidyverse)
df[,f_名称]%as.data.frame
更好的是,由以下人员提供的优雅且惯用的解决方案:
请给出一个小的可复制示例和预期结果。这很整洁。
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
library(tidyverse)
df[, f_names] <- lapply(df[, f_names], function(x) fct_explicit_na(x, na_level = "to_impute")) %>% as.data.frame
library(dplyr)
df = df %>% mutate_if(is.factor,
fct_explicit_na,
na_level = "to_impute")