es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SAS – Marcar si una variable está presente en otra columna del mismo conjunto de datos.

Tengo un conjunto de datos SAS con 2 columnas que quiero comparar (VAR1 y VAR2). Me gustaría verificar si para cada valor de VAR1 este valor existe en alguna parte de la columna VAR2. Si el valor de VAR1 no existe en ninguna parte de la columna VAR2, quiero marcarlo como 1.
Por ejemplo:

Tengo esto:

TABLE in

VAR1 VAR2
k3 t7
t7 g7
p8 k3

Y quiero esto:

TABLE out

VAR1 VAR2 FLAG
k3 t7 0
t7 g7 0
p8 k3 1

Intenté usar

FLAG = ifn(indexw(VAR2,VAR1,0,1)

Pero este método solo compara las dos columnas para la fila actual.

¡Gracias de antemano por su ayuda!

Edición: Intenté ejecutar este código como sugirió Joe pero me encontré con un error.

Código:

data your_table;
length VAR1 $2;
length VAR2 $2;
input VAR1 VAR2;
datalines;
k3 t7
t7 g7
p8 k3
;

data for_fmt;
set your_table;
fmtname = ‘VAR2F’;
start = var2;
label = ‘0’;
output;
if n eq 1 then do;
hlo = ‘o’;
start = .;
label = ‘1’;
output;
end;
run;

proc sort nodupkey data=for_fmt;
by start;
run;

proc format cntlin=for_fmt;
quit;

data want;
set your_table;
flag = put(var1,var2f.);
run;

Error:

ERROR: Este rango se repite o los valores se superponen: .- ..

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para comprobar si cada valor de VAR1 existe en alguna parte de la columna VAR2, puedes utilizar un formato para asignar una etiqueta de 0 a cada valor de VAR2 y una etiqueta de 1 a todos los demás valores. Luego, puedes utilizar la función PUT con el formato creado para asignar la etiqueta a cada valor de VAR1 y crear una nueva variable FLAG basada en si la etiqueta es 0 o 1.

    Aquí tienes un ejemplo de código que logra esto:

    /* crear conjunto de datos de ejemplo */
    data have;
       input VAR1 $ VAR2 $;
       datalines;
    k3 t7
    t7 g7
    p8 k3
    ;
    
    /* crear formato para asignar 0 a los valores de VAR2 y 1 a los demás valores */
    data fmt;
       set have;
       fmtname = 'VAR2F';
       start = VAR2;
       label = '0';
       output;
       by VAR2 notsorted;
       if first.VAR2 then do;
          start = ' ';
          label = '1';
          output;
       end;
    run;
    
    /* aplicar formato y crear variable FLAG */
    data want;
       set have;
       flag = put(VAR1, VAR2F.);
    run;
    

    Esto creará un nuevo conjunto de datos llamado “want” con la variable FLAG que indica si cada valor de VAR1 existe en la columna VAR2 del conjunto de datos original. Si el valor existe, FLAG será 0. Si el valor no existe, FLAG será 1.

Comments are closed.