SAS按组生成序号
SAS generate sequence number by group
我需要在SAS中按组创建序号并按组累加。
我有一个数据集,其中有一列显示事件是否发生以及事件发生的时间。我还有初始日期时间和结束日期时间,我在示例数据中没有表示。
Event
Time
0
0
0
0
1
0.3
1
0.4
1
0.4
0
0
0
0
1
0.1
1
0.5
我需要为事件发生的每个组分配一个序列号并创建一个累积。
它应该看起来像:
Event
Time
Group
Cumulative
0
0
0
0
0
0
0
0
1
0.3
1
1.1
1
0.4
1
0
1
0.4
1
0
0
0
0
0
0
0
0
0
1
0.1
2
0.6
1
0.5
2
0
我一直在使用保留函数,但没有成功。
感谢您的建议。
问候
试试这个
data have;
input Event Time;
datalines;
0 0
0 0
1 0.3
1 0.4
1 0.4
0 0
0 0
1 0.1
1 0.5
;
data want(drop = c g);
c = 0;
do _N_ = 1 by 1 until (last.event);
set have;
by event notsorted;
c + time;
if first.event and event then g + 1;
end;
do _N_ = 1 to _N_;
set have;
group = ifn(event, g, 0);
cumulative = ifn(_N_ = 1, c, 0);
output;
end;
run;
结果:
Event Time group cumulative
0 0.0 0 0.0
0 0.0 0 0.0
1 0.3 1 1.1
1 0.4 1 0.0
1 0.4 1 0.0
0 0.0 0 0.0
0 0.0 0 0.0
1 0.1 2 0.6
1 0.5 2 0.0
希望对您有所帮助。我不确定是否可以一次完成。
输入数据:
data a;
input event time;
cards;
0 0
0 0
1 0.3
1 0.4
1 0.4
0 0
0 0
1 0.1
1 0.5
;
run;
代码:
data group (keep=event time group) cum(keep=group_cnt total_time index=(group_cnt));
retain group_cnt 0 total_time 0;
set a end=end_ds;
if ( not event and lag(event) ) then
output cum;
if ( event and not lag(event) ) then
group_cnt+1;
if ( not event ) then do;
total_time=0;
group=0;
end;
else do;
total_time=sum(total_time, time);
group=group_cnt;
end;
output group;
if ( end_ds and event ) then
output cum;
run;
data want;
keep event time group total_time;
set group;
group_cnt=group;
if ( group and not lag (group)) then
set cum key=group_cnt;
else total_time=0;
run;
结果:
0 0 0 0
0 0 0 0
1 0.3 1 1.1
1 0.4 1 0
1 0.4 1 0
0 0 0 0
0 0 0 0
1 0.1 2 0.6
1 0.5 2 0
我需要在SAS中按组创建序号并按组累加。
我有一个数据集,其中有一列显示事件是否发生以及事件发生的时间。我还有初始日期时间和结束日期时间,我在示例数据中没有表示。
Event | Time |
---|---|
0 | 0 |
0 | 0 |
1 | 0.3 |
1 | 0.4 |
1 | 0.4 |
0 | 0 |
0 | 0 |
1 | 0.1 |
1 | 0.5 |
我需要为事件发生的每个组分配一个序列号并创建一个累积。
它应该看起来像:
Event | Time | Group | Cumulative |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
1 | 0.3 | 1 | 1.1 |
1 | 0.4 | 1 | 0 |
1 | 0.4 | 1 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
1 | 0.1 | 2 | 0.6 |
1 | 0.5 | 2 | 0 |
我一直在使用保留函数,但没有成功。
感谢您的建议。 问候
试试这个
data have;
input Event Time;
datalines;
0 0
0 0
1 0.3
1 0.4
1 0.4
0 0
0 0
1 0.1
1 0.5
;
data want(drop = c g);
c = 0;
do _N_ = 1 by 1 until (last.event);
set have;
by event notsorted;
c + time;
if first.event and event then g + 1;
end;
do _N_ = 1 to _N_;
set have;
group = ifn(event, g, 0);
cumulative = ifn(_N_ = 1, c, 0);
output;
end;
run;
结果:
Event Time group cumulative
0 0.0 0 0.0
0 0.0 0 0.0
1 0.3 1 1.1
1 0.4 1 0.0
1 0.4 1 0.0
0 0.0 0 0.0
0 0.0 0 0.0
1 0.1 2 0.6
1 0.5 2 0.0
希望对您有所帮助。我不确定是否可以一次完成。
输入数据:
data a;
input event time;
cards;
0 0
0 0
1 0.3
1 0.4
1 0.4
0 0
0 0
1 0.1
1 0.5
;
run;
代码:
data group (keep=event time group) cum(keep=group_cnt total_time index=(group_cnt));
retain group_cnt 0 total_time 0;
set a end=end_ds;
if ( not event and lag(event) ) then
output cum;
if ( event and not lag(event) ) then
group_cnt+1;
if ( not event ) then do;
total_time=0;
group=0;
end;
else do;
total_time=sum(total_time, time);
group=group_cnt;
end;
output group;
if ( end_ds and event ) then
output cum;
run;
data want;
keep event time group total_time;
set group;
group_cnt=group;
if ( group and not lag (group)) then
set cum key=group_cnt;
else total_time=0;
run;
结果:
0 0 0 0
0 0 0 0
1 0.3 1 1.1
1 0.4 1 0
1 0.4 1 0
0 0 0 0
0 0 0 0
1 0.1 2 0.6
1 0.5 2 0