SAS代码计算百分比差异

时间:2014-07-26 17:46:08

标签: sas

我正在处理一个" long"包含各种血液测量条目的数据集。我希望能够计算每个新LDL水平相对于LDL第一读数的%差异。

我成功创建了一个start_dt变量,该变量可以为每个连续观察保留,但我无法弄清楚如何添加" start_LDL"因此,在每行中,我可以计算最新条目和第一个条目之间的%差异。

以下是数据集的示例(显然,有很多缺失(。)看起来像黑色空格):

id  ldl  lab_dt     start_dt    diff_ldl    VISIT
1       17Oct2001   17Oct2001                 1
1       17Oct2001   17Oct2001                 2
1   173 17Oct2001   17Oct2001                 3
1       20Oct2006   17Oct2001                 4
1       20Oct2006   17Oct2001                 5
1       20Oct2006   17Oct2001                 6
1   165 20Oct2006   17Oct2001                 7
2       06Jul2000   06Jul2000                 1
2       06Jul2000   06Jul2000                 2
2       06Jul2000   06Jul2000                 3
2   166 06Jul2000   06Jul2000                 4
2       09Jan2001   06Jul2000                 5
2       09Jan2001   06Jul2000                 6
2       09Jan2001   06Jul2000                 7
2   209 09Jan2001   06Jul2000                 8
2       02Mar2001   06Jul2000                 9
2       06Mar2001   06Jul2000                10
2       06Mar2001   06Jul2000                11
2       06Mar2001   06Jul2000                12
2   203 06Mar2001   06Jul2000                13
2       18Apr2001   06Jul2000                14
2       18Apr2001   06Jul2000                15
2       18Apr2001   06Jul2000                16
2   183 18Apr2001   06Jul2000                17
2       02May2001   06Jul2000                18
2       07May2001   06Jul2000                19
2       08May2001   06Jul2000                20
2       17May2001   06Jul2000                21
2       31May2001   06Jul2000                22
2       31May2001   06Jul2000                23
2       31May2001   06Jul2000                24
2   83  31May2001   06Jul2000                25

这是我目前的代码。有时,id(first.id)的第一个记录缺少ldl的值,所以start_ldl是(。),这意味着从那里向前移动没有任何作用(或者整个编码可能是错误的!)。


proc sort data=lab; by id date; run;                        

data labnew;
set lab;
by id;
retain start_dt ldl diff_ldl ;

IF FIRST.id THEN VISIT = 1;
ELSE VISIT + 1;

if first.id then start_dt=date;
else start_dt=start_dt;

if first.id then start_ldl=ldl;
else start_ldl=start_ldl;

yeardiff=floor((date-start_dt)/365.25);
diff_ldl=((ldl-start_ldl)/start_ldl)*100;

format start_dt date9.;

运行;

如果有人可以就我如何为此编码提出建议,我将不胜感激!

非常感谢!

1 个答案:

答案 0 :(得分:1)

你想要第一个非缺失的ldl继续前进,对吗?

未经测试,会建议:

data labnew;
  set lab;
  by id;
  retain start_dt start_ldl diff_ldl ;

  *initialize retained variables for each by group;   
  if first.id then do;
    visit=0;
    start_dt=date;
    start_ldl=.;
    diff_ldl=.;
  end;

  visit+1;
  if missing(start_ldl) then start_ldl=ldl; 

  yeardiff=floor((date-start_dt)/365.25);
  if n(ldl,start_ldl)=2 then diff_ldl=((ldl-start_ldl)/start_ldl)*100;

  format start_dt date9.;
run;