gpt4 book ai didi

sas - 使用SAS中滞后的前向后向方法填充缺失值

转载 作者:行者123 更新时间:2023-12-01 13:36:22 24 4
gpt4 key购买 nike

假设您有一个表,其中包含用户名、计数器和每个计数器的分数。

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 函数在排列表中向前填充缺失值(根据初始表向后移动),如下所示。

我在do-loop中使用了lag函数,因为我想在每一步更新之前的值(例如,值40会从一路从第一名到最后一名得分)。

然而,我得到了奇怪的结果。所有缺失值都没有真正的值(value)。关于修复最后一个数据步骤有什么想法吗?

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;

最佳答案

不需要使用lag,使用retain(或等效的)。这是一个双 DoW 循环解决方案,它在一个数据步中完成(实际上,一次读取 - 它缓冲读取,因此这与单次读取一样有效)。

首先,我们遍历数据集以获取找到的第一个分数,因此我们可以获取该分数作为初始 prev_score 值。然后设置它,并重新循环遍历该用户的行并输出。这里没有实际的 retain,因为我自己在做循环,但它类似于是否有 retain prev_score;,这是一个正常的数据步循环。我实际上并没有保留它,因为我希望它在遇到新用户时消失。

data want;
do _n_ = 1 by 1 until (last.user);
set have;
by user;
if missing(first_score) and not missing(score) then
first_score = score;

end;
prev_score = first_score;
do _n_ = 1 by 1 until (last.user);
set have;
by user;
if missing(score) then
score = prev_score;
prev_score = score;
output;
end;
run;

关于sas - 使用SAS中滞后的前向后向方法填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42961591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com