如何在dplyr中替换因子指定值为NA且不改变变量类型
用tidyverse替换因子中的特定值为NA且保留类型
先看示例数据:
df <- data.frame(v1 = factor(letters[1:5]), v2 = 1:5) glimpse(df) # Rows: 5 # Columns: 2 # $ v1 <fct> a, b, c, d, e # $ v2 <int> 1, 2, 3, 4, 5
如果用ifelse()替换v1中的"b"和"d"为NA,会导致因子类型被转换成数值型,不符合需求:
df %>% mutate(v1 = ifelse(v1 %in% c("b", "d"), NA, v1)) %>% glimpse() # Rows: 5 # Columns: 2 # $ v1 <int> 1, NA, 3, NA, 5 # $ v2 <int> 1, 2, 3, 4, 5
可行解决方案
方法1:使用replace()函数
replace()会保留原变量的类型,直接替换指定位置的值为NA,写法简洁:
df %>% mutate(v1 = replace(v1, v1 %in% c("b", "d"), NA)) %>% glimpse() # Rows: 5 # Columns: 2 # $ v1 <fct> a, NA, c, NA, e # $ v2 <int> 1, 2, 3, 4, 5
方法2:使用case_when()并转换回因子
通过case_when()判断条件,先转成字符型处理后再转回因子,逻辑清晰:
df %>% mutate(v1 = case_when( v1 %in% c("b", "d") ~ NA_character_, TRUE ~ as.character(v1) ) %>% factor()) %>% glimpse() # Rows: 5 # Columns: 2 # $ v1 <fct> a, NA, c, NA, e # $ v2 <int> 1, 2, 3, 4, 5
方法3:使用forcats::fct_recode()
借助forcats包的fct_recode(),直接将指定因子水平替换为NA,专门针对因子处理:
library(forcats) df %>% mutate(v1 = fct_recode(v1, NA = "b", NA = "d")) %>% glimpse() # Rows: 5 # Columns: 2 # $ v1 <fct> a, NA, c, NA, e # $ v2 <int> 1, 2, 3, 4, 5
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

