我有一个数据集:
data data;
input group $ count;
datalines;
A 4
A 3
A 2
A 1
B 1
C 1
D 2
D 1
E 1
F 1
G 2
G 1
H 1
;
run;
第一个变量是组标识符,第二个变量是按组计数观察数,数据集按组排序,然后按降序计数。
我想要一个新变量,该变量应为每个组使用“ count”变量的最大值,例如:
data data;
input group $ count max_count;
datalines;
A 4 4
A 3 4
A 2 4
A 1 4
B 1 1
C 1 1
D 2 2
D 1 2
E 1 1
F 1 1
G 2 2
G 1 2
H 1 1
;
run;
我设法得到的最接近的是:
data data;
set data;
by group;
if first.group then max_count=count;
run;
但是结果是:
data data;
input group $ count max_count;
datalines;
A 4 4
A 3 .
A 2 .
A 1 .
B 1 1
C 1 1
D 2 2
D 1 .
E 1 1
F 1 1
G 2 2
G 1 .
H 1 1
;
run;
请问如何执行此操作?
答案 0 :(得分:3)
您可以使用顺序的DOW循环进行此类处理。 DOW循环是其中SET语句位于循环内的循环-在介绍性DATA步骤编程中未教授的一种布置。第一个循环将“测量”组以计算一些组级别的度量,第二个循环将在输出行时将度量应用于组中的每个成员。
data want;
do _n_ = 1 by 1 until (last.group);
set have;
by group;
if count > maxcount then maxcount = count;
end;
do _n_ = 1 to _n_;
set have;
output;
end;
run;
编辑-更简单
我没有仔细阅读问题-它说明了
数据集按组排序,然后按计数降序排列。
data want;
set data;
by group descending count;
if first.group then max_count = count;
retain max_count;
run;
说明
接受排序条件初步表示该最大值已在组中的第一条记录中得知。因此,不需要DOW循环来“测量”组。
要点:
descending count
中的BY
by语句强制执行推定条件
first.group
在一组行中检测该组值已更改的第一行。如果满足BY条件,这是最大计数点。
max_count
retain max_count
是不可执行的语句。 RETAIN
通知DATA Step编译器不要重置为丢失指定的非数据集变量(在隐式DATA步骤循环的顶部)。因此,分配给组中的所有行后,max_count都保持不变。
答案 1 :(得分:1)
在数据步骤中的另一种方法是,您也可以使用哈希对象。
data want;
if _n_ = 1 then do;
dcl hash h(multidata:"Y", dataset:"data");
h.definekey("group");
h.definedone();
end;
set data ;
by group;
if h.find() = 0 then do until(h.find_next() ne 0);
max_count=sum(max_count,1);
end;
run;