quelques plus d'options sur-ingénierie qui pourrait être intéressant pour ceux qui ont besoin de le faire avec un ensemble de données vraiment grand, où la performance est plus préoccupante:
- Si votre jeu de données est déjà trié par ID, mais pas par X dans chaque ID, vous pouvez toujours le faire en une seule étape de données sans aucun tri, en utilisant un maximum conservé dans chaque groupe. Vous pouvez également utiliser des moyens proc (selon la première réponse), mais avec une instruction
by
plutôt qu'une instruction class
, ce qui réduit l'utilisation de la mémoire.
data sample;
input id x;
datalines;
18 1
18 1
18 2
18 1
18 2
369 2
369 3
369 3
361 1
;
run;
data want;
do until(last.ID);
set sample;
by ID;
xmax = max(x, xmax);
end;
x = xmax;
drop xmax;
run;
- Même si votre ensemble de données ne sont pas triées par ID, vous pouvez toujours le faire en une seule étape de données, sans les trier, à l'aide d'un objet de hachage pour garder la trace de la valeur x maximale que vous avez trouvée pour chaque ID au fur et à mesure.Ce sera un peu plus rapide que
proc means
et utilisera généralement moins de mémoire, car les moyens proc font divers calculs en arrière-plan qui ne sont pas nécessaires dans le jeu de données en sortie.
data _null_;
set sample end = eof;
if _n_ = 1 then do;
call missing(xmax);
declare hash h(ordered:'a');
rc = h.definekey('ID');
rc = h.definedata('ID','xmax');
rc = h.definedone();
end;
rc = h.find();
if rc = 0 then do;
if x > xmax then do;
xmax = x;
rc = h.replace();
end;
end;
else do;
xmax = x;
rc = h.add();
end;
if eof then rc = h.output(dataset:'want2');
run;
Dans cet exemple, sur mon PC, l'approche de hachage utilisé cette quantité de mémoire:
memory 966.15k
OS Memory 27292.00k
vs autant pour un résumé de proc équivalent:
memory 8706.90k
OS Memory 35760.00k
Non une mauvaise économie si vous en avez vraiment besoin pour l'augmenter!