如何统计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
相关产品推荐
相关产品推荐

