首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr或forcats重新编码NA因子

使用dplyr或forcats重新编码NA因子
EN

Stack Overflow用户
提问于 2021-02-28 08:59:24
回答 1查看 194关注 0票数 0

我正在尝试使用tidyverse中的forcatsdplyr包将NA中的单个因子重新编码为字符串。我遇到的问题是,我试图更改的因子是一个NA值,并且我遇到了一个错误。

我发现这个问题(R how to change one of the level to NA)正在将一个因子更改为NA,但我正在尝试将其从NA更改。

这是我尝试过的:

代码语言:javascript
复制
library(dplyr)
df %>% 
  group_by(Units) %>% 
  summarize(Frequency = n(), 
            Total = sum(Responses, na.rm = T)) %>% 
  mutate(Units = recode_factor(Units, "No Response" = NA_character_))

# A tibble: 5 x 3
  Units     Frequency Total
  <fct>         <int> <dbl>
1 (0,3]             4     8
2 (3,10]            5    31
3 (10,30]           2    38
4 (100,Inf]         3   673
5 NA                1     0
Warning messages:
1: Problem with `mutate()` input `Units`.
i Unknown levels in `f`: NA
i Input `Units` is `fct_recode(Units, `No Response` = NA_character_)`. 
2: Unknown levels in `f`: NA 

代码语言:javascript
复制
library(forcats)
df %>% 
  group_by(Units) %>% 
  summarize(Frequency = n(), 
            Total = sum(Responses, na.rm = T)) %>% 
  mutate(Units = fct_recode(Units, "No Response" = NA_character_))

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 5 x 3
  Units     Frequency Total
  <fct>         <int> <dbl>
1 (0,3]             4     8
2 (3,10]            5    31
3 (10,30]           2    38
4 (100,Inf]         3   673
5 NA                1     0

示例数据:

代码语言:javascript
复制
df <- structure(list(ID = c("000002", "000008", "000009", "000018", 
"000021", "000033", "000045", "000051", "000064", "000067", "000070", 
"000072", "000074", "000088", "000112"), Responses = c(18, 6, 
300, 8, 7, 150, 6, 4, 2, 3, 20, NA, 223, 2, 1), Units = structure(c(3L, 
2L, 5L, 2L, 2L, 5L, 2L, 2L, 1L, 1L, 3L, NA, 5L, 1L, 1L), .Label = c("(0,3]", 
"(3,10]", "(10,30]", "(30,100]", "(100,Inf]"), class = "factor")), row.names = c(NA, 
-15L), class = c("tbl_df", "tbl", "data.frame"))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-28 09:22:57

使用专门为处理NA值而编写的fct_explicit_na

代码语言:javascript
复制
library(dplyr)
library(forcats)

df %>% 
  group_by(Units) %>% 
  summarize(Frequency = n(), 
            Total = sum(Responses, na.rm = T)) %>% 
  mutate(Units = fct_explicit_na(Units, "No Response"))

#  Units       Frequency Total
#* <fct>           <int> <dbl>
#1 (0,3]               4     8
#2 (3,10]              5    31
#3 (10,30]             2    38
#4 (100,Inf]           3   673
#5 No Response         1     0

您还可以在数据中包含新级别,然后使用replace更改NA值。

代码语言:javascript
复制
levels(df$Units) <- c(levels(df$Units), "No Response")

df %>% 
  group_by(Units) %>% 
  summarize(Frequency = n(), 
            Total = sum(Responses, na.rm = T)) %>% 
  mutate(Units = replace(Units, is.na(Units), "No Response"))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66404946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档