SAS数据步最大数量(按组)

时间:2018-09-28 14:41:02

标签: 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;
   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;

请问如何执行此操作?

2 个答案:

答案 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;