如何用dplyr的mutate函数生成符合条件的HEART列并筛选目标字段?
使用dplyr创建HEART衍生变量
需求概述
基于数据框中的HEART1、CARDIO、ANGINA三列生成HEART变量,规则如下:
- 三列中任意一列等于1 →
HEART = 1 - 三列全部等于0 →
HEART = 0 - 三列全部为NA →
HEART = NA
示例数据
ID <- c(1,1,1,2,2,2,3,3,3) HEART1 <- c(1,0,NA,0,0,0,0,0,NA) CARDIO <- c(1,0,0,0,0,0,0,1,NA) ANGINA <- c(1,0,1,0,0,0,0,1,NA) SLEEP <- c(1,1,1,0,0,0,0,0,0) df <- data.frame(ID, HEART1, CARDIO, ANGINA, SLEEP)
期望HEART列结果:c(1,0,1,0,0,0,0,1,NA)
解决方案
使用dplyr的mutate()结合case_when()、if_any()、if_all()函数,同时通过精准列选择排除无关列(如SLEEP),代码如下:
library(dplyr) df <- df %>% mutate( HEART = case_when( # 任意目标列等于1时赋值1 if_any(c(HEART1, CARDIO, ANGINA), ~ .x == 1) ~ 1, # 所有目标列等于0时赋值0 if_all(c(HEART1, CARDIO, ANGINA), ~ .x == 0) ~ 0, # 所有目标列都是NA时返回NA if_all(c(HEART1, CARDIO, ANGINA), is.na) ~ NA_real_, # 兜底情况(如部分NA但无1的情况,示例中已被前序条件覆盖) TRUE ~ NA_real_ ) )
关键说明
- 列选择方式:除了直接指定列名向量
c(HEART1, CARDIO, ANGINA),还可以用列匹配工具简化选择,比如:
这种方式适合列名有规律的场景,无需逐一列写。# 匹配包含指定关键词的列 matches("HEART1|CARDIO|ANGINA") - 注意
NA_real_的使用:因为case_when()要求所有返回值类型一致,数值型的NA需要用NA_real_而非NA。
内容的提问来源于stack exchange,提问作者Jenn0804
相关产品推荐
相关产品推荐

