【问题标题】:SAS retain statement groupSAS 保留语句组
【发布时间】:2021-04-07 12:24:44
【问题描述】:

我在使用 SAS 语句保留在组中时遇到问题。 假设我有一个数据集:

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;

请帮忙? 非常感谢!!

【问题讨论】:

    标签: if-statement sas retain


    【解决方案1】:

    dev 似乎只是nr 组内的一个行计数器,have 似乎只关注nr 组。

    假设L 已经存在于前面的步骤中,并且by 组只是nr,您可以通过从不重新分配@ 来将flag 状态L 延续到flag2 987654331@之后是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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多