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

在dplyr的if_else中保留NA值及批量生成判断列的技术问询

解决两个dplyr处理答题数据的问题

问题1:保留原数据中的NA值

你当前用if_else时,默认会把NA输入转为0,要保留NA的话,直接利用if_else的.na参数指定NA输出即可——注意要使用NA_integer_保证输出类型统一:

mydf <- mydf %>%
  mutate(A1.1 = if_else(A1 %in% c("A"), 1L, 0L, .na = NA_integer_),
         A2.1 = if_else(A2 %in% c("A", "B"), 1L, 0L, .na = NA_integer_),
         A3.1 = if_else(A3 %in% c("A", "B"), 1L, 0L, .na = NA_integer_))

处理后结果会保留原数据中的NA:

ID diagnosis   A1   A2   A3 A1.1 A2.1 A3.1
a       yes    A    A    B    1    1    1
b       yes    B    C    D    0    0    0
c        no <NA>    C <NA>   NA    0   NA
d        no    E    C    D    0    0    0
e       yes    D <NA>    B    0   NA    1

问题2:批量生成判断列

面对30个题目,逐个写mutate过于繁琐,推荐用dplyr::across结合正确答案映射表批量处理:

步骤1:定义每个题目的正确答案

先创建一个命名列表,存储所有题目的正确答案:

correct_ans <- list(
  A1 = c("A"),
  A2 = c("A", "B"),
  A3 = c("A", "B")
  # 按此格式继续添加剩余27个题目的正确答案
)

步骤2:用across批量生成判断列

指定要处理的目标列(比如所有以A开头加数字的题目列),批量生成带.1后缀的判断列:

mydf <- mydf %>%
  mutate(across(matches("^A\\d+"),  # 匹配所有A开头的题目列
                ~ if_else(.x %in% correct_ans[[cur_column()]], 
                          1L, 0L, .na = NA_integer_),
                .names = "{col}.1"))  # 新列命名规则:原列名+.1

这一行代码就能完成所有题目的判断列生成,同时保留原数据的NA值。


内容的提问来源于stack exchange,提问作者dplyr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:45:39