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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:33