Je voudrais créer une variable id pour identifier les groupes uniques en fonction de plusieurs variables.
Par exemple, j'ai les voitures de données de sashelp.cars
, et je voudrais identifier des groupes uniques de Make
- DriveTrain
et Cylindre
avec la variable id grp_id
. Ainsi, le même Make
et le même DriveTrain
avec un nombre différent de Cylinder
seraient considérés comme un nouveau groupe (et par conséquent, une nouvelle valeur dans le variable id grp_id
).
J'ai essayé ce qui suit, mais cela réinitialiserait la variable id à 1 quand il y avait un nouveau cas, ni vraiment considérer chaque combinaison unique de Make + DriveTrain + Cylinder
comme étant différente identifiant de groupe.
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;
Une idée sur la façon de créer cette variable grp_id
en utilisant plusieurs variables comme critères?
3 Réponses :
En utilisant votre propre code, il vous suffit de faire une petite modification
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;
Vous n'avez besoin que des premiers cylindres, pas des premiers restants, ils se chevauchent.
Vous voulez que chaque combinaison ait un identifiant de groupe unique. Ne réinitialisez pas l'ID de groupe. Si vous attribuiez également un numéro séquentiel au sein du groupe, vous réinitialiseriez la variable de séquence.
Quand réinitialiser. Pour les combinaisons, incrémentez l'identifiant du groupe lorsque la dernière variable répertoriée par variable est étiquetée comme ayant l'état first.
Exemple:
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;
Remarque: Conceptuellement, BY
définit une hiérarchie de n variables. Lorsqu'une variable de la hiérarchie change de valeur, lors d'un passage en série dans les données, son état est défini first.varm = 1 . De plus, tous les niveaux subordonnés d'abord. les variables automatiques auront le même état. En d'autres termes, cette assertion est vraie: premier.varm+1 = 1 ... d'abord. var n=1
Comme alternative, voici une approche de hachage qui ne nécessite pas de tri.
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;