2010-07-14 21 views

Respuesta

2

No entiendo muy bien su ejemplo. No me puedo imaginar que el conjunto de datos de entrada realmente tenga todos los valores en una observación. En su lugar, ¿quieres decir algo como esto?

data sample; 
    input myid myvalue; 
datalines; 
18 1 
18 1 
18 2 
18 1 
18 2 
369 2 
369 3 
369 3 
361 1 
; 

proc sort data=sample; 
    by myid myvalue; 
run; 

data result; 
    set sample; 
    by myid; 

    if last.myid then output; 
run; 

proc print data=result; 
run; 

Esto le daría este resultado:

Obs myid myvalue 

1  18  2 
2  361  1 
3  369  3 
0

uso de un adecuado proc con la declaración by. Por ejemplo,

data sample; 
    input myid myvalue; 
datalines; 
18 1 
18 1 
18 2 
18 1 
18 2 
369 2 
369 3 
369 3 
361 1 
; 
run; 

proc sort data=sample; 
    by myid; 
run; 

proc means data=sample; 
    var myvalue; 
    by myid; 
run; 
9

Medios Proc con una declaración de clase (por lo que no tiene que ordenar) y solicitando la estadística máximo es probablemente el método más sencillo (no probado):

 
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; 


proc means data=sample noprint max nway missing; 
    class id; 
    var x; 
    output out=sample_max (drop=_type_ _freq_) max=; 
run; 

Salida la documentación SAS en línea para obtener más detalles sobre Proc Means (http://support.sas.com/onlinedoc/913/docMainpage.jsp).

1

Usted podría intentar esto:

PROC SQL; 
CREATE TABLE CHCK AS SELECT MYID, MAX(MYVALUE) FROM SAMPLE 
GROUP BY 1; 
QUIT; 
0

lo haría sólo una especie por x e id poniendo el valor más alto para cada ID en la parte superior. NODUPKEY elimina todos los duplicados a continuación.

proc sort data=yourstacked_data out=yourstacked_data_sorted; 
by DECENDING x id; 
run; 

proc sort data=yourstacked_data NODUPKEY out=top_value_only; 
by id; 
run; 
3

Si desea mantener tanto todos los registros y el valor máximo de X por id, me gustaría utilizar el PROC MEDIOS aproach seguido de un estado de mezcla, o se puede ordenar los datos de identificación y descienden X primero , y luego utilice la sentencia retener a crear el MAX_VALUE directamente en la datastep:

PROC SORT DATA=A; BY ID DESCENDING X; RUN; 

DATA B; SET A; 
BY ID; 
RETAIN X_MAX; 
IF FIRST.ID THEN X_MAX = X; 
ELSE    X_MAX = X_MAX; 
RUN; 
1

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:

  1. 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; 
  1. 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!

Cuestiones relacionadas