按多个变量分组时创建组ID

时间:2020-03-31 14:42:06

标签: group-by sas grouping

我想创建一个id变量,根据几个变量来标识唯一组。

例如,我有sashelp.cars的数据车,我想用id变量{{来标识Make-DriveTrainCylinder的唯一组1}}。因此,相同的grp_id和相同的Make和不同数量的DriveTrain将被视为一个新组(因此,id变量Cylinder中的新值)。

我尝试了以下操作,但是在出现新情况时,这会将id变量重置为1,也没有真正考虑将grp_id的每个唯一组合视为不同的组id。

Make + DriveTrain + Cylinder

关于如何使用几个变量作为标准来创建此data cars; set sashelp.cars; run; proc sort data=cars; by Make DriveTrain Cylinders; run; data cars; set cars; grp_id + 1; by Make DriveTrain Cylinders if first.Make or first.DriverTrain or first.Cylinders then grp_id = 1; run; 变量的想法吗?

3 个答案:

答案 0 :(得分:3)

您希望每个组合都有唯一的组ID。不要重设群组ID。如果还要在组中分配一个序列号,则可以重置序列变量。

何时重置。对于组合,当变量最后列出的标记为状态为first.

时,增加组ID。

示例:

proc sort data=sashelp.cars out=cars; 
  by Make DriveTrain Cylinders;
run;

data cars;
  set cars;
  by Make DriveTrain Cylinders;

  if first.Cylinders then grp_id + 1;

  * this answer gives you bonus information ! ;
  if first.Cylinders 
    then seq_in_group = 1; 
    else seq_in_group + 1;
run;

注意:概念上BY定义了n个变量的层次结构。当层次结构中的变量更改值时,在串行访问数据期间,其状态将首先设置为 var m = 1 。此外,所有下属级别 first。。自动变量的状态相同。换句话说,此断言是正确的: first。 var m + 1 = 1 ... ... first。 var n = 1

答案 1 :(得分:2)

作为替代方案,这是一种不需要排序的哈希方法。

data cars;
   if _N_ = 1 then do;
      declare hash h ();
      h.definekey ('Make', 'DriveTrain', 'Cylinders');
      h.definedata ('grp_id');
      h.definedone();
   end;

   set sashelp.cars;

   if h.find () ne 0 then grp_id + 1;
   h.replace();
run;

答案 2 :(得分:1)

使用您自己的代码,您只需要进行一点更改

data cars; 
   set sashelp.cars; 
run;

proc sort data=cars; 
   by Make DriveTrain Cylinders; 
run;

data cars;
   set cars;
   by Make DriveTrain Cylinders;
   if first.Make or first.DriveTrain or first.Cylinders then grp_id + 1; 
run;