vuelos the software power military know check airline sas

the - sas vuelos



sas problema con retener para reemplazar los datos que faltan (2)

Como SAS trabaja fila por fila a través del conjunto de datos, no hay ningún valor para reemplazar si falta el primer valor. Puede ordenar los datos por categoría y precio DESCENDING para evitar esto.

proc sort data= WORK.TOYDATA; by Category DESCENDING PRICE; run;

O si solo hay un valor NON-missing por categoría, puede usar una unión SQL, por ejemplo

proc sql; create table WORK.OUTTOYDATA as select a.Category, coalesce(a.PRICE, b.PRICE) as PRICE from WORK.TOYDATA a left join (select distinct Category, PRICE from WORK.TOYDATA where PRICE ne . ) b on a.Category eq b.Category ; quit;

El siguiente código simplificado heredado está destinado a reemplazar los valores perdidos de una columna con los valores de las entradas que no faltan en un grupo:

DATA WORK.TOYDATA; INPUT Category $ PRICE; DATALINES; Cat1 2 Cat1 . Cat1 . Cat2 . Cat2 3 Cat2 . ; DATA WORK.OUTTOYDATA; SET WORK.TOYDATA; BY Category ; RETAIN _PRICE; IF FIRST.Category THEN _PRICE=PRICE; IF NOT MISSING(PRICE) THEN _PRICE=PRICE; ELSE PRICE=_PRICE; DROP _PRICE; RUN;

Desafortunadamente, esto no funcionará si falta la primera entrada en un grupo. ¿Cómo podría ser esto solucionado?


Como señaló @Jetzler, la forma más fácil es simplemente ordenar los datos. Sin embargo, si tiene varias columnas con valores perdidos, entonces deberá hacer varios tipos, lo que no es eficiente.

Otra opción de hacer un join es proc stdize que se puede usar para reemplazar valores perdidos con una medida simple (media, mediana, suma, etc.). El método predeterminado será suficiente en su ejemplo, solo necesita agregar la opción de reponly que solo reemplaza los valores perdidos y no estandariza los datos.

DATA WORK.TOYDATA; INPUT Category $ PRICE; DATALINES; Cat1 2 Cat1 . Cat1 . Cat2 . Cat2 3 Cat2 . ; run; proc stdize data=TOYDATA out=want reponly; by category; var price; run;