我想创建一个id变量,根据几个变量来标识唯一组。
例如,我有sashelp.cars
的数据车,我想用id变量{{来标识Make
-DriveTrain
和Cylinder
的唯一组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;
变量的想法吗?
答案 0 :(得分:3)
您希望每个组合都有唯一的组ID。不要重设群组ID。如果还要在组中分配一个序列号,则可以重置序列变量。
何时重置。对于组合,当变量最后列出的标记为状态为first.
示例:
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;