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语句中的
    递减计数
    强制执行假定条件
    • 如果计数未按预期排序,则日志中将出现错误
  • first.group
    检测组值已更改的行组中的第一行。这是当满足BY条件时计数最大的点

    • 跟踪器变量
      max_count
      仅在此时分配
  • retain max_count
    是一条不可执行语句
    RETAIN
    告诉数据步骤编译器不要重置为缺少指定的非数据集变量(在隐式数据步骤循环的顶部)。因此,组中所有行的最大_计数在分配后保持不变


您可以使用顺序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语句中的
    递减计数
    强制执行假定条件
    • 如果计数未按预期排序,则日志中将出现错误
  • first.group
    检测组值已更改的行组中的第一行。这是当满足BY条件时计数最大的点

    • 跟踪器变量
      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语句中没有“递减计数”,现在我知道出了什么问题,再次感谢!