如何在DataFrame中按组创建递归滚动基线评分变量?
滚动基线评分(Roving Baseline Score)的分组计算问题
我有一份包含每位患者多个临床结局观测值的数据集,观测时间点间隔不固定。需要为临床结局创建**滚动基线评分(roving baseline score)**变量,规则是:每当至少90天后的首个时间点确认评分出现上升或下降时,该基线评分就会更新。
示例数据集
library(tidyverse) df <- tibble( patID = c("1", "1", "1", "1", "1", "1", "2", "2", "3", "3", "3", "3", "3", "3"), time_point = c("1", "2", "3", "4", "5", "6", "1", "2", "1", "2", "3", "4", "5", "6"), date = as.Date(c("2020-01-01", "2020-05-01", "2020-06-01", "2020-09-01", "2021-01-01", "2021-05-01", "2020-01-01", "2020-05-01", "2020-01-01", "2020-02-01", "2020-03-01", "2020-06-01", "2020-10-01", "2021-04-01")), score = c("300", "100", "100", "100", "200", "200", "600", "400", "300", "200", "200", "100", "400", "300"))
期望输出
期望得到的基线评分向量如下:
baseline = c("300", "300", "300", "100", "100", "200", "600", "600", "300", "300", "300", "200", "200", "300")
规则说明
- 患者1:评分在时间点2从300降至100,该下降可在时间点4(距时间点2至少90天的最近时间点)确认,因此时间点4的新基线为100;时间点6确认评分相对最新基线上升,新基线更新为200。
- 患者2:仅有2个时间点,无法确认基线变化,基线保持初始值。
- 患者3:评分在时间点2降至200,距该时间点至少90天的最近时间点是时间点4,确认下降后更新基线为200;时间点5评分升至400,距该时间点至少90天的最近时间点是时间点6,确认上升后更新基线为300。
遇到的问题
我尝试用for循环创建该变量,但不知道如何按患者分组处理。后续尝试用sapply编写代码,却出现「argument is of length 0」错误,尝试的代码如下:
df_baseline <- df %>% group_by(patID) %>% mutate(baseline = lag(score, default = first(score)), closest_index_90 = sapply(1:n(), function(i) { valid_indices <- which(date[i]+90 <= date[(i+1):n()]) if (length(valid_indices)>0) {return(first(valid_indices) + i)} else {return(NA)} }), baseline = sapply(1:n(), function(i) { if (score[i:closest_index_90[i]] > baseline[i - 1] | score[i:closest_index_90[i]] < baseline[i - 1]) {return(score[which.min(abs(score[i:closest_index_90[i]]-baseline[i-1]))])} else {return(baseline[i-1])}}))
我刚接触R语言,对for循环和sapply函数的使用能力有限,未找到针对性解法,恳请帮助!
内容的提问来源于stack exchange,提问作者Evy
相关产品推荐
相关产品推荐

