1
votes

Créer un identifiant de groupe lors du regroupement par plusieurs variables

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?


0 commentaires

3 Réponses :


1
votes

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;


1 commentaires

Vous n'avez besoin que des premiers cylindres, pas des premiers restants, ils se chevauchent.



3
votes

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


0 commentaires

2
votes

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;


0 commentaires