Dataframe SAS数据步长最大值(按组)
我有一个数据集:Dataframe SAS数据步长最大值(按组),dataframe,sas,Dataframe,Sas,我有一个数据集: 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; dataline
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;
您知道如何执行此操作吗?您可以使用顺序DOW循环进行此类处理。DOW循环是一种循环中包含SET语句的循环——在介绍性数据步编程中没有教授这种安排。第一个循环将“测量”组以计算一些组级度量,第二个循环将在输出行时将度量应用于组中的每个成员
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;
编辑-更简单
我没有仔细阅读这个问题,它说
数据集按组排序,然后按计数降序排序
解释
初步接受排序条件意味着在组中的第一条记录中已经知道最大值。因此,不需要道指循环来“衡量”该集团
亮点:
BY语句中的BY
强制执行假定条件递减计数
- 如果计数未按预期排序,则日志中将出现错误
检测组值已更改的行组中的第一行。这是当满足BY条件时计数最大的点first.group
- 跟踪器变量
仅在此时分配max_count
- 跟踪器变量
是一条不可执行语句retain max_count
告诉数据步骤编译器不要重置为缺少指定的非数据集变量(在隐式数据步骤循环的顶部)。因此,组中所有行的最大_计数在分配后保持不变RETAIN
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;
编辑-更简单
我没有仔细阅读这个问题,它说
数据集按组排序,然后按计数降序排序
解释
初步接受排序条件意味着在组中的第一条记录中已经知道最大值。因此,不需要道指循环来“衡量”该集团
亮点:
BY语句中的BY
强制执行假定条件递减计数
- 如果计数未按预期排序,则日志中将出现错误
检测组值已更改的行组中的第一行。这是当满足BY条件时计数最大的点first.group
- 跟踪器变量
仅在此时分配max_count
- 跟踪器变量
是一条不可执行语句retain max_count
告诉数据步骤编译器不要重置为缺少指定的非数据集变量(在隐式数据步骤循环的顶部)。因此,组中所有行的最大_计数在分配后保持不变RETAIN
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;
另一种方法是在数据步骤中,也可以使用哈希对象
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;
非常好用,谢谢你的代码,也谢谢你的解释,我不知道,非常感谢!感谢第二个选项,我尝试了类似的方法,但是在by语句中没有“递减计数”,现在我知道出了什么问题,再次感谢!非常好用,谢谢你的代码,也谢谢你的解释,我不知道,非常感谢!感谢第二个选项,我尝试了类似的方法,但是在by语句中没有“递减计数”,现在我知道出了什么问题,再次感谢!