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

如何统计R数据框中吸烟前后满足心脏病标识条件的个体数量

解决方案

核心思路

要解决这两个统计问题,关键是先获取每个个体首次吸烟的时间点和首次出现心脏病(HD)的时间点,再通过比较这两个时间点的先后进行分类统计。由于实际普查次数多,先把宽格式数据转成长格式会更高效易维护。

代码实现

首先加载tidyverse工具包(未安装的话先运行install.packages("tidyverse")):

library(tidyverse)

# 原始数据框
df <- data.frame(
  ID = 1:3,
  SMOKE_AUT10 = c(0, 0, 0),
  SMOKE_SPR10 = c(0, 0, 0),
  SMOKE_SUM10 = c(0, 1, 1),
  SMOKE_AUT11 = c(0, 0, 0),
  HD_AUT10 = c(0, 0, 0),
  HD_SPR10 = c(1, 1, 0),
  HD_SUM10 = c(1, 1, 0),
  HD_AUT11 = c(1, 0, 1)
)

# 1. 宽格式转长格式,拆分指标类型与时间
df_long <- df %>%
  pivot_longer(cols = -ID, 
               names_to = c("indicator", "time"), 
               names_sep = "_",
               values_to = "status") %>%
  # 将时间转为因子,确保按实际普查顺序排序(可根据你的真实时间序列调整levels)
  mutate(time = factor(time, levels = c("AUT10", "SPR10", "SUM10", "AUT11")))

# 2. 提取每个个体首次吸烟、首次出现HD的时间
individual_times <- df_long %>%
  group_by(ID, indicator) %>%
  filter(status == 1) %>%
  summarise(first_time = min(time), .groups = "drop") %>%
  pivot_wider(names_from = indicator, values_from = first_time, names_prefix = "first_")

# 3. 分类统计目标个体数量
result <- individual_times %>%
  mutate(
    # 问题1:有吸烟记录,且首次HD早于首次吸烟
    smoke_before_hd = !is.na(first_SMOKE) & !is.na(first_HD) & first_HD < first_SMOKE,
    # 问题2:有吸烟记录,且首次HD晚于首次吸烟
    hd_after_smoke = !is.na(first_SMOKE) & !is.na(first_HD) & first_HD > first_SMOKE
  )

# 输出结果
cat("开始吸烟前已出现HD的个体数量:", sum(result$smoke_before_hd, na.rm = TRUE), "\n")
cat("开始吸烟后才出现HD的个体数量:", sum(result$hd_after_smoke, na.rm = TRUE), "\n")

代码说明

  • 数据重塑:pivot_longer将分散在列中的时间点状态转为行记录,避免重复写判断逻辑;时间转因子是为了保证排序严格匹配实际普查顺序。
  • 首次时间提取:分组筛选状态为1的记录,取最小时间即为首次出现的节点。
  • 分类统计:通过逻辑判断明确两类个体的判定规则,直接统计符合条件的数量。

示例运行结果

开始吸烟前已出现HD的个体数量: 1 
开始吸烟后才出现HD的个体数量: 1 

内容的提问来源于stack exchange,提问作者allen.joseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:16:34