SAS9

Cómo extraer y concatenar nombres de variables condicionalmente

Simon 7 views

En la gestión de datos clínicos o de marketing, es común encontrar tablas donde la información está dispersa en varias columnas. Una tarea habitual es identificar qué columnas contienen datos para un individuo determinado y luego crear una lista resumida de estos nombres de columna en una única variable.

Este artículo explica cómo usar las funciones ARRAY, VNAME y CATX en SAS© para transformar una estructura "ancha" en una lista descriptiva concatenada.

Cómo extraer y concatenar nombres de variables condicionalmente -

El Problema

Imaginemos un conjunto de datos que contiene identificadores de pacientes y varias columnas correspondientes a diferentes estudios (Study1ID, Study2ID, etc.). Si un paciente está inscrito en un estudio, la columna contiene un ID. De lo contrario, está vacía o ausente.

Datos de entrada:

CurrentStudyStudy1IDStudy2IDStudy3IDStudy4ID
001180780.560
002.790.520
003...231

Resultado deseado:

Queremos crear una nueva variable (por ejemplo, Other_enrolled_studies) que enumere los nombres de los estudios en los que participa el paciente, separados por una coma.

CurrentStudyOther_enrolled_studies
001Study1ID, Study2ID, Study4ID
002Study2ID, Study4ID
003Study4ID

La Solución: El poder de VNAME

La clave para resolver este problema reside en la función VNAME(). A diferencia de la mayoría de las funciones de SAS© que procesan el valor de una variable, VNAME devuelve el nombre de la variable misma.

Combinada con un bucle sobre una matriz (ARRAY), esta función permite recorrer dinámicamente las columnas.

Método 1: El enfoque iterativo (Recomendado)

Este método es el más directo y, a menudo, el más eficaz. Consiste en:

  1. Declarar un ARRAY que agrupe todas las columnas de interés.

  2. Iterar sobre esta matriz.

  3. Verificar si el valor no está ausente.

  4. Si existe un valor, concatenar el nombre de la variable (a través de VNAME) a nuestra variable de resultado.

1DATA want;
2 SET have;
3 LENGTH studies $200; /* Définir la longueur pour éviter la troncature */
4
5 /* 1. Déclarer un tableau regroupant les variables commençant par 'Study' */
6 array study(*) study: ;
7
8 /* 2. Boucler sur chaque élément du tableau */
9 DO i=1 to dim(study);
10 /* 3. Vérifier si la valeur n'est pas manquante */
11 IF not missing(study(i)) THEN DO;
12 /* 4. Concaténer le nom de la variable */
13 studies = catx(", ", studies, vname(study(i)));
14 END;
15 END;
16
17 drop i;
18RUN;

Puntos clave del código:

  • study: : Los dos puntos son un carácter comodín (wildcard) que selecciona todas las variables que comienzan con el prefijo "Study".

  • catx(", ", ...) : Esta función es ideal porque maneja automáticamente los separadores. No agrega una coma al principio de la cadena si está vacía y elimina los espacios innecesarios.

Método 2: El enfoque de matrices paralelas

Otra forma de hacerlo es usar dos matrices: una para los valores numéricos y otra para almacenar los nombres como caracteres, y luego concatenar todo al final.

1
 
1DATA want;
2 SET have;
3 /* Tableau des valeurs sources */
4 array var1(*) Study1ID Study2ID Study3ID Study4ID;
5 /* Tableau temporaire pour stocker les noms */
6 array var2(*) $32 Study1IDc Study2IDc Study3IDc Study4IDc;
7
8 DO i = 1 to dim(var1);
9 IF var1(i) ne . THEN var2(i) = vname(var1(i));
10 END;
11
12 /* Concaténation finale de tout le tableau de noms */
13 newvar = catx(',', of var2(*));
14
15 drop i Study1IDc Study2IDc Study3IDc Study4IDc;
16RUN;

Nota sobre el rendimiento

Aunque el segundo método funciona, puede ser menos eficiente en conjuntos de datos muy grandes si la función catx se coloca dentro del bucle. De hecho, concatenar la totalidad de una lista en cada iteración es una operación innecesariamente costosa.

Si se utiliza el enfoque iterativo (Método 1), el uso de catx línea por línea a medida que se cumplen las condiciones sigue siendo muy eficiente, ya que solo se construye una cadena de caracteres de forma progresiva.

El uso conjunto de ARRAY y VNAME ofrece una enorme flexibilidad para la limpieza de datos ("Data Munging"). Esto permite transformar la estructura de los metadatos (los nombres de las columnas) en datos utilizables (valores de celda), lo que es particularmente útil para generar informes resumidos automatizados.