在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
相关产品推荐
相关产品推荐

