un par de más más de la ingeniería opciones que podrían ser de interés para cualquier persona que tiene que hacer esto con una muy grande conjunto de datos, en donde el rendimiento es más una preocupación:
- Si su conjunto de datos ya está ordenado por ID, pero no por X dentro de cada ID, puede hacerlo en un solo paso de datos sin ninguna clasificación, utilizando un máximo retenido dentro de cada uno por grupo. Alternativamente, puede usar medios de proceso (según la respuesta superior) pero con una declaración
by
en lugar de una declaración class
, esto reduce el uso de la memoria.
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;
- Incluso si el conjunto de datos no están ordenados por ID, todavía se puede hacer esto en un solo paso de datos, sin ordenar que, mediante el uso de un objeto hash para realizar un seguimiento del valor x máximo que ha encontrado para cada ID a medida que avanza.Esto será un poco más rápido que
proc means
y típicamente usará menos memoria, ya que proc significa hacer varios cálculos en el fondo que no son necesarios en el conjunto de datos de salida.
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;
En este ejemplo, en mi PC, el enfoque hash utilizado esta cantidad de memoria:
memory 966.15k
OS Memory 27292.00k
frente a esta cantidad por un resumen proc equivalente:
memory 8706.90k
OS Memory 35760.00k
No
¡un mal ahorro si realmente lo necesita para escalar!