我有这张桌子:
我想使用 SAS 基础添加两列:
这里是输出表:
我尝试使用此 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。
你能帮我吗? 谢谢!
我怀疑你工作太辛苦了。由于您没有提供任何数据,所以我们来弥补一下。
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