如何创建一个依赖于其自身先前值的变量?

问题描述 投票:0回答:1

我有一个数据集,其中包含对每位患者临床结果的多次观察。这些时间点之间的长度是可变的。我想为临床结果创建一个“流动基线评分”变量,每次在至少提前 90 天的第一个时间点确认评分的增加或减少时,该变量都会发生变化。新基线应该是最接近旧基线值的值。

我创建了一个示例数据框,其中包含两名患者的观察结果(患者 1 有 6 个观察结果,患者 2 只有 2 个观察结果):

library(dplyr)

df <- data.frame(
patID  = c("1", "1", "1", "1", "1", "1", "2", "2"),     
time_point = c("1", "2", "3", "4", "5", "6", "1", "2"),
date = c("01-01-2020", "01-05-2020", "01-06-2020", "01-09-2020", "01-01-2021", "01-05-2021", "01-01-2020", "01-05-2021"),
score = c("300", "100", "100", "50", "200", "200", "600", "400"))

具有基线分数的向量应产生以下结果:

baseline = c("300", "300", "300", "100", "100", "200", "600", "600") 
  • 解释:患者 1 的评分在时间点 2 从 200 下降到 100。这种下降可以在时间点 4 得到确认,因为这是至少提前 90 天的最近时间点。因此,时间点 4 的新基线为 100(在 100 和 50 之间,该值最接近旧基线 300)。在时间点 6,分数(相对于最后一个基线)的增加得到确认,我们获得了 300 的新基线。 患者 2 只有两个时间点,因此无法确认基线的变化。

我尝试使用 for 循环创建变量,但我不知道如何制作它,以便为每个患者单独完成。

在我最近的尝试中,我尝试使用 sapply 首先创建表示确认时间点索引的变量,然后创建基线变量:

df <- df %>%
group_by(patID) %>%
mutate(
conf_index = 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 = if_else(row_number()==1, score, NA),
baseline = sapply(1:n()), function(i) {
  if (is.na(baseline[i])) {return({
    if (all(score[(i):conf_index[i]] > baseline[i-1]) | all(score[(i):conf_index[i]] < baseline[i-1])) {return(score[which.min(abs(score[i:conf_index[i]]-baseline[i-1]))])}
    else {return(baseline[i-1])}})}
  else {return(baseline[i])}
  }

但是,我的代码不断出现错误,此时我已经没有想法了。我对 R 比较陌生,所以我对 for 循环和 sapply 函数的技能有限。我浏览了这里提出的许多问题,但似乎没有一个具体回答我的问题。任何帮助将不胜感激!

r for-loop dplyr sapply
1个回答
0
投票

def recursive_function(n): 如果 n <= 0: return 1 else: return n * recursive_function(n - 1)

结果=递归函数(5)

© www.soinside.com 2019 - 2024. All rights reserved.