R语言:针对长格式数据按患者计算指定区间既往依从性均值
解决方案:计算分组区间内的依从性均值
以下是基于tidyverse工具链的实现代码,可直接复现需求:
library(tidyverse) # 生成原始数据集 patient <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2) month <- rep(1:10, 2) fev1 <- c(58, NA, NA, NA, 57, NA, NA, NA, NA, 60, NA, NA, NA, NA, 32, NA, NA, NA, NA, 40) adherence <- c(30, 32, 34, 36, 34, 32, 30, 34, 32, 36, 70, 65, 75, 70, 70, 55, 50, 65, 70, 70) data <- tibble(patient, month, fev1, adherence) # 新增mean adherence列 data_result <- data %>% group_by(patient) %>% mutate( # 标记fev1非缺失的行 fev1_flag = !is.na(fev1), # 获取上一个非NA行的位置(第一个非NA行的前置位置标记为0) prev_fev1_pos = ifelse(fev1_flag, lag(cumsum(fev1_flag), default = 0), NA), # 当前行的位置 current_pos = row_number(), # 区间结束位置为当前行的前一行 end_pos = ifelse(fev1_flag, current_pos - 1, NA) ) %>% rowwise() %>% mutate( `mean adherence` = ifelse( fev1_flag, # 第一个非NA行无前置区间,返回NA;其他行计算区间均值 ifelse(prev_fev1_pos == 0, NA, mean(adherence[prev_fev1_pos:end_pos])), NA ) ) %>% ungroup() %>% # 移除辅助计算列 select(-fev1_flag, -prev_fev1_pos, -current_pos, -end_pos) # 查看结果 print(data_result)
代码逻辑说明
- 分组定位:按
patient分组,确保每个患者的计算独立进行。 - 区间标记:
fev1_flag标记所有fev1非缺失的行,作为区间计算的触发点。prev_fev1_pos通过累积求和+滞后操作,定位每个非NA行对应的上一个非NA行的位置(第一个非NA行的前置位置设为0,表示无有效前置区间)。end_pos确定区间的结束位置:当前非NA行的前一行。
- 均值计算:用
rowwise()逐行处理,仅对fev1非缺失的行计算对应区间内adherence的均值,其余行填充NA。
验证结果
- 患者1第5个月(fev1=57):计算
adherence[1:4]的均值,结果为33。 - 患者1第10个月(fev1=60):计算
adherence[5:9]的均值,结果为32.4。 - 患者2第5个月(fev1=32):计算
adherence[11:14]的均值,结果为70。 - 患者2第10个月(fev1=40):计算
adherence[15:19]的均值,结果为62。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

