我正在处理一个" 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.;
如果有人可以就我如何为此编码提出建议,我将不胜感激!
非常感谢!
答案 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;