SAS-BASE---如何在特定条件下将一个值与以下值相加

问题描述 投票:0回答:1

我有这张桌子:

我想使用 SAS 基础添加两列:

  • _idx_new 聚合具有 perc_tot_1 的类<=1 with the next ones untill the new percentage is greater than 1
  • perc_tot_2 具有新的百分比

这里是输出表:

我尝试使用此 SAS 代码来计算 idx_new:

data test1;
 set dataset;
 by _idx;
 perc_tot = _freq/&tot.;
 perc_tot_1 = _freq/&tot.*100;
 retain _idx_new 0;
 if perc_tot_1 < 1 and lag1(perc_tot_1)>=1 then do;
    _idx_new = _idx_new+1;
 end;
 if perc_tot_1 < 1 and lag1(perc_tot_1)<1 then do;
    _idx_new = _idx_new;
    a=1;
 end;
run;

但是它不能正常工作。而且我不知道如何计算 perc_tot_2。

你能帮我吗? 谢谢!

sas aggregate
1个回答
1
投票

我怀疑你工作太辛苦了。由于您没有提供任何数据,所以我们来弥补一下。

data have;
  row+1;
  input percent;
cards;
30
0.5
0.4
1.2
40
0.1
0.2
0.9
6
;

现在只需处理数据,当当前百分比或前一个百分比很大时,则增加新的分组变量。您还希望在第一次观察时增加,即使百分比很小(否则组数将从零而不是从一开始计数)。

data want;
  set have;
  if (_n_=1) or (percent>1) or (lag(percent)>1) then idx+1;
run;

结果

Obs    row    percent    idx

 1      1       30.0      1
 2      2        0.5      2
 3      3        0.4      2
 4      4        1.2      3
 5      5       40.0      4
 6      6        0.1      5
 7      7        0.2      5
 8      8        0.9      5
 9      9        6.0      6

如果您想聚合小百分比,您可以通过新的分组变量进行汇总。

proc summary data=want;
  by idx;
  var percent;
  output out=collapsed(drop=_type_) sum=;
run;

结果:

Obs    idx    _FREQ_    percent

 1      1        1        30.0
 2      2        2         0.9
 3      3        1         1.2
 4      4        1        40.0
 5      5        3         1.2
 6      6        1         6.0
© www.soinside.com 2019 - 2024. All rights reserved.