You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:27:42