首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据前面的行更新基线值

根据前面的行更新基线值
EN

Stack Overflow用户
提问于 2022-04-20 00:05:39
回答 1查看 125关注 0票数 0

每个研究对象都有一个基线。一旦该值与基准之间的差值超过5,该值将成为所有未来比较的基准,直到另一个值超过此新基线5为止。

这就是我希望输出数据看起来的样子:

这就是我要得到的

这是我目前的代码,它让我和我尝试过的任何东西一样接近。我尝试了不同的组合保留,滞后()和干扰素(suggested in this post)

代码语言:javascript
复制
Data Have;
 Input Visit usubjid Baseline Value;
 datalines;
1 1 112.2 112.2
2 1 112.2 113.7
3 1 112.2 112
3 1 112.2 108
4 1 112.2 109
5 1 112.2 107
7 1 112.2 106
8 1 112.2 107
; 
run;

proc sort;by usubjid;run;

data want;
 Length chg $71;
 retain chg;
 set Have;
 length prevchg $71;
 by usubjid;
 prevchg=chg;
 if first.usubjid then do; prevchg=''; end;
 baseline=ifn(prevchg in ('Increase >= 5mm New', "Decrease >= 5mm"),lag(value),lag(baseline));

 diff = value-baseline;
 if visit > 1 then do;
  if diff > 5 then do; chg='Increase >= 5mm New'; order = 3; end;
  else if diff < -5 then do; chg = 'Decrease >= 5mm'; order = 6; end;
  else if -5 <= diff <= 5 then do; 
    if prevchg in('Increase >= 5mm New', 'Increase > 5mm Persistent') then do; chg ='Increase > 5mm Persistent'; order = 4; end;
    else do; chg = 'No Change (change >= -5 and <= 5mm)'; order = 5; end;
  end;
 end;
run;

现在,代码将正确地将基线更新为下一次访问的前一个值,然后直接回到原来的基线。我确信这与延迟()的方式有关,并且与if/然后保持工作有关,但我无法找到解决方案。下面是这个问题的一个例子:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-20 02:42:51

你应该能轻松地做到这一点。如果要保留基线变量的值,则不能在输入中。

代码语言:javascript
复制
data want ;
  set have ;
  by usubjid;
  retain baseline;
  if first.usubjid then baseline=value;
  difference = baseline - value;
  output;
  if difference > 5 then baseline=value;
run;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71932654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档