【发布时间】:2017-08-15 03:42:02
【问题描述】:
假设您有一个表,其中包含用户名、计数器和每个计数器的分数。
data have;
input user $ counter score;
cards;
A 1 .
A 2 .
A 3 40
A 4 .
A 5 20
A 6 .
B 1 30
B 2 .
C 1 .
C 2 .
C 3 .
;
run;
某些计数器之间缺少某些分数,您想输入与前一个计数器相同的分数。所以结果将如下所示:
A 1 40
A 2 40
A 3 40
A 4 40
A 5 20
A 6 20
B 1 30
B 2 30
C 1 .
C 2 .
C 3 .
我设法使用下面的lag 函数来填补缺失的分数值:
data result1a;
set have(keep=user);
by user;
*Look ahead;
merge have have(firstobs=2 keep=score rename=(score=_NextScore));
if first.user then do;
if score= . then score=_NextScore;
end;
else do;
_PrevScore = lag(score);
if score= . then score=_PrevScore;
end;
output;
run;
然后我在counter 上使用descending 函数将表格向后排序,如下所示:
proc sort data = result1a out= result1b;
by user descending counter ;
run;
最后,我将通过再次使用lag 函数在 raarranged 表中向前填充缺失值(根据初始表向后移动),如下所示。
我在do-loop中使用了lag函数,因为我想在每一步更新之前的值(例如,值40会从组中的第一个分数一直到最后一个分数)。
但是,我得到了奇怪的结果。所有缺失值都没有真正的价值。关于修复最后一个数据步骤的任何想法?
data result1c;
set result1b;
by user;
if first.user then do;
if score= . then score=_NextScore;
else score = score;
end;
else do;
_PrevScore = lag(score);
if score= . then
score=_PrevScore;
else score = score;
end;
output;
run;
【问题讨论】:
标签: sas lag missing-data