vista valores tipos sintaxis referencia recodificar perdidos ingresar encuesta ejemplos datos como comandos anchura sql sas

sql - tipos - Seleccione las variables de caracteres que tienen todos los valores perdidos



valores perdidos spss (3)

Tengo un conjunto de datos SAS con alrededor de 3.000 variables, y me gustaría deshacerme de las variables de caracteres para las que faltan todos los valores. Sé cómo hacer esto para las variables numéricas. Me pregunto específicamente sobre las variables de caracteres. Necesito hacer el trabajo usando SAS base, pero eso podría incluir SQL proc, por lo que también he etiquetado este ''SQL''.
¡Gracias!

Editar:
Información general: este es un conjunto de datos alto, con datos de encuestas de 7 olas de entrevistas. Algunos, pero no todos, los ítems de la encuesta (variables) se repitieron a través de las ondas. Intento crear una lista de los elementos que se utilizaron en realidad en cada ola tirando de todos los registros de esa ola, eliminando todas las columnas que no tienen nada más que los valores faltantes por defecto de SAS, y luego ejecutando proc contents .


Probablemente haya una manera más simple, pero esto es lo que se me ocurrió.

Saludos Rob

EDITAR: Tenga en cuenta que esto funciona para las variables numéricas y de caracteres.

** ** TEST DATASET *; data x; col1 = "a"; col2 = ""; col3 = "c"; output; col1 = "" ; col2 = ""; col3 = "c"; output; col1 = "a"; col2 = ""; col3 = "" ; output; run; ** ** GET A LIST OF VARIABLE NAMES *; proc sql noprint; select name into :varlist separated by " " from sashelp.vcolumn where upcase(libname) eq "WORK" and upcase(memname) eq "X"; quit; %put &varlist; ** ** USE A MACRO TO CREATE A DATASTEP. FOR EACH COLUMN THE ** THE DATASTEP WILL CREATE A NEW COLUMN WITH THE SAME NAME ** BUT PREFIXED WITH "DELETE_". IF THERE IS AT LEAST 1 ** NON-MISSING VALUE FOR THE COLUMN THEN THE "DELETE" COLUMN ** WILL FINISH WITH A VALUE OF 0, ELSE 1. WE WILL ONLY ** KEEP THE COLUMNS CALLED "DELETE_" AND OUTPUT ONLY A SINGLE ** OBSERVATION TO THE FINAL DATASET. *; %macro find_unused_cols(iDs=); %local cnt; data vars_to_delete; set &iDs end=eof; %let cnt = 1; %let varname = %scan(&varlist, &cnt); %do %while ("&varname" ne ""); retain delete_&varname; delete_&varname = min(delete_&varname, missing(&varname)); drop &varname; %let cnt = %eval(&cnt + 1); %let varname = %scan(&varlist, &cnt); %end; if eof then do; output; end; run; %mend; %find_unused_cols(iDs=x); ** ** GET A LIST OF VARIABLE NAMES FROM THE NEW DATASET ** THAT WE WANT TO DELETE AND STORE TO A MACRO VAR. *; proc transpose data=vars_to_delete out=vars_to_delete; run; proc sql noprint; select substr(_name_,8) into :vars_to_delete separated by " " from vars_to_delete where col1; quit; %put &vars_to_delete; ** ** CREATE A NEW DATASET CONTAINING JUST THOSE VARS ** THAT WE WANT TO KEEP *; data new_x; set x; drop &vars_to_delete; run;


Creé una macro que verificará columnas de caracteres vacíos y las eliminará del original o creará un nuevo conjunto de datos con las columnas vacías eliminadas. Se necesitan dos argumentos opcionales: el nombre del conjunto de datos (por defecto es el conjunto de datos creado más recientemente) y un sufijo para nombrar la nueva copia (establecer el sufijo en nada para editar el original).

Utiliza proc freq con la opción de niveles y un formato personalizado para determinar las columnas de caracteres vacíos. proc sql se usa para crear una lista de las columnas que se eliminarán y almacenarlas en una variable de macro.

Aquí está la macro:

%macro delemptycol(ds=_last_, suffix=_noempty); option nonotes; proc format; value $charmiss '' ''= '' '' other=''1''; run; %if "&ds"="_last_" %then %let ds=&syslast.; ods select nlevels; ods output nlevels=nlev; proc freq data=&ds.(keep=_character_) levels ; format _character_ $charmiss.; run; ods output close; /* create macro var with list of cols to remove */ %local emptycols; proc sql noprint; select tablevar into: emptycols separated by '' '' from nlev where NNonMissLevels=0; quit; %if &emptycols.= %then %do; %put DELEMPTYCOL: No empty character columns were found in data set &ds.; %end; %else %do; %put DELEMPTYCOL: The following empty character columns were found in data set &ds. : &emptycols.; %put DELEMPTYCOL: Data set &ds.&suffix created with empty columns removed; data &ds.&suffix. ; set &ds(drop=&emptycols); run; %end; options notes; %mend;

Uso de ejemplos:

/* create some fake data: Here char5 will be empty */ data chardata(drop= j randnum); length char1-char5 $8.; array chars(5) char1-char5; do i=1 to 100; call missing(of char:); randnum=floor(10*ranuni(i)); do j=2 to 5; if (j-1)<randnum<=(j+1) then chars(j-1)="FOO"; end; output; end; run; %delemptycol(); /* uses default _last_ for the data and "_noempty" as the suffix */ %delemptycol(ds=chardata, suffix=); /* removes the empty columns from the original */


Rob y cmjohns, muchas gracias por tu ayuda. De acuerdo con sus soluciones y una idea que tuve durante el fin de semana, esto es lo que se me ocurrió:

%macro removeEmptyCols(origDset, outDset); * get the number of obs in the original dset; %let dsid = %sysfunc(open(&origDset)); %let origN = %sysfunc(attrn(&dsid, nlobs)); %let rc = %sysfunc(close(&dsid)); proc transpose data= &origDset out= transpDset; var _all_; run; data transpDset; set transpDset; * proc transpose converted all old vars to character, so the . from old numeric vars no longer means ''missing''; array oldVar_ _character_; do over oldVar_; if strip(oldVar_) = "." then oldVar_ = ""; end; * each row from the old dset is now a column with varname starting with ''col''; numMiss = cmiss(of col:); numCols = &origN; run; proc sql noprint; select _NAME_ into: varsToKeep separated by '' '' from transpDset where numMiss < numCols; quit; data &outDset; set &origDset (keep = &varsToKeep); run; %mend removeEmptyCols;

Intentaré las 3 formas e informaré cuál es el más rápido ...

PS añadido el 23 de diciembre de 2010 para referencia futura: documento SGF 048-2010: descartar automáticamente las variables con solo valores perdidos