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

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)

代码逻辑说明

  1. 分组定位:按patient分组,确保每个患者的计算独立进行。
  2. 区间标记:
    • fev1_flag标记所有fev1非缺失的行,作为区间计算的触发点。
    • prev_fev1_pos通过累积求和+滞后操作,定位每个非NA行对应的上一个非NA行的位置(第一个非NA行的前置位置设为0,表示无有效前置区间)。
    • end_pos确定区间的结束位置:当前非NA行的前一行。
  3. 均值计算:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:15:40