我希望以相同数字的顺序得到最后一个数字。例如,我有以下数据集:
X
1
1
0
0
0
1
1
0
鉴于数字序列,我需要提取“一个”序列的最后一个数字,直到看起来为0.这就是我想要的:
X Seq
1 1
1 2
1 3
0 1
0 2
0 3
1 1
1 2
0 1
1 1
1 2
1 3
0 1
我需要创建一个新数据集,其数字以粗体显示,即:
SEQ1
3
2
3
感谢您的任何建议。
答案 0 :(得分:0)
在此处使用带有notsorted选项的proc摘要:
data math;
input x;
datalines;
1
1
1
0
0
0
1
1
0
1
0
1
1
1
1
0
1
;
run;
proc summary data=math;
by x notsorted;
class x;
output Out=z;
run;
data z (drop=_type_ x);
set z (rename=(_FREQ_=COUNT));
where _type_=1 and x=1;/*if you are looking for other number then 1, replace it here*/
run;
proc print data=z noobs;
run;
结果是:
答案 1 :(得分:0)
您可以使用延迟创建组变量,然后保留您创建的每个组的最后一次观察:
data temp;
input x $;
datalines;
1
1
1
0
0
0
1
1
0
1
1
1
0
;
run;
data temp2;
set temp;
retain flag;
if lag(x) > x then flag = _n_;
if x = 0 then delete;
run;
data temp3 (keep = seq1);
set temp2;
seq1 + 1;
by flag;
if first.flag then seq1 = 1;
if last.flag then save = 1;
if missing(save) then delete;
run;
答案 2 :(得分:0)
这是一个只使用一个带保留语句的数据步骤的解决方案。
data have;
input x @@;
output;
datalines;
1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1
;
data want(keep = count);
set have end = last;
retain x_previous . count .;
if x = 0 then do;
if x_previous = 1 then do;
output;
count = 0;
end;
end;
else if x = 1 then count + 1;
if last = 1 and count > 0 then output;
x_previous = x;
run;
count
-----
3
2
1
4
1
答案 3 :(得分:0)
还有一个选项 - 使用NOTSORTED BY组选项。
Data want;
Set have;
By x NOTSORTED;
Retain count;
If first.x then count=1;
Else count+1;
If last.x then output;
Keep count;
Run;