我在组中使用SAS语句retain时遇到了问题。假设我有一个数据集:
data have_data;
input dev nr amount flag $ ;
cards;
1 1356 30000 S
2 1356 35000 S
3 1356 40000 L
4 1356 35000 S
1 2345 15000 S
2 2345 20000 S
3 2345 20000 S
4 2345 25000 S
5 2345 25000 S
1 3456 39000 S
2 3456 40000 L
3 3456 45000 L
4 3456 35000 S
;
run;我想创建一个列flag2,如果在dev和nr组中的数量>=为40000,则保留'L‘。输出应如下所示:
data want_data;
input dev nr amount flag $ flag2 $ ;
cards;
1 1356 30000 S S
2 1356 35000 S S
3 1356 40000 L L
4 1356 35000 S L
1 2345 15000 S S
2 2345 20000 S S
3 2345 20000 S S
4 2345 25000 S S
5 2345 25000 S S
1 3456 39000 S S
2 3456 40000 L L
3 3456 45000 L L
4 3456 35000 S L
;
run;我首先对数据进行了排序,并尝试了以下方法,因为我找到了关于这方面的类似帖子,但它不起作用。
data new_data;
set have_data;
by dev nr;
retain test;
if flag = 'L' then help=1;
if first.nr then test = help;
flag2 = test;
run;请帮帮忙?非常感谢!
发布于 2021-04-07 20:53:44
dev看起来只是nr组中的一个行计数器,而have似乎只关注nr组。
假设上一步中已经存在L,并且by组只是nr,那么您可以在flag2中继续使用flag状态L,方法是在flag2为L之后再也不要重新分配它。
示例:
data want;
set have;
by nr;
retain flag2;
* flag2 is reset at start of group, or assigned if L state not reached yet;
if first.nr or flag2 ne 'L' then flag2=flag;
run;https://stackoverflow.com/questions/66986026
复制相似问题