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.

Recorriendo varios conjuntos de datos para crear uno único.

Me gustaría crear una macro en SAS que ejecute algún código según algunas configuraciones.
Tengo tres conjuntos de datos, df1, df2 y df3, todos ellos guardados en la biblioteca work.
No es necesario utilizar todos ellos: puede ser que quiera comparar df1 con df2 o solo considerar df3. Mi objetivo es crear un nuevo conjunto de datos con información específica de este/estos conjunto/s de datos. df1, df2 y df3 tienen las mismas variables pero un número diferente de observaciones.

Por ejemplo:

df1
Nombre   Apellido  NombreUsuario  Puntuación
A.       B.        mal             24
B.       J.        ninguno92       54


df2
Nombre  Apellido  NombreUsuario  Puntuación
Jenny   B.        jben42          25
S.      C.        btw             34
H.      H.        hhhg241         64

df3
Nombre  Apellido  NombreUsuario  Puntuación
F.      B.        gd523           22
H.      G.G.      df51            34

La lógica de la macro debería ser:

  • tomar el primer conjunto de datos;
  • tomar el segundo conjunto de datos (si está seleccionado);
  • tomar el tercer conjunto de datos (si está seleccionado);
  • crear un conjunto de datos con información de los conjuntos de datos seleccionados.

He intentado probar la macro de la siguiente manera:

%macro select_datasets(df1, df2, df3, acción);

%let dataset1=df1;
%let dataset2=df2;
%let dataset3=df3;

%if &dataset1=y and &dataset2=y and &dataset3=y %then %let dataset_list= &dataset1 &dataset2 &dataset3;
%if &acción=1 %then %do; /* crear un conjunto de datos que incluya las observaciones de todos los conjuntos de datos */
%end;

%mend;

%select_datasets(df1=y, df2=y, df3=y, 1);

La macro anterior no devuelve ninguna salida, probablemente significa que hay algunos errores en la lógica y la implementación.
Necesitaría tener un conjunto de datos final.

Nombre   Apellido  NombreUsuario  Puntuación
A.       B.        mal             24
B.       J.        ninguno92       54
Jenny    B.        jben42          25
S.       C.        btw             34
H.       H.        hhhg241         64
F.       B.        gd523           22
H.       G.G.      df51            34

La macro debería funcionar incluso si hay dos o un conjunto de datos en lugar de 3.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr la salida deseada, la macro puede actualizarse de la siguiente manera:

    %macro select_datasets(dataset1=y, dataset2=y, dataset3=y);
    
    %if &dataset1=y %then %do;
        data temp_dataset;
        set work.df1;
        run;
    %end;
    
    %if &dataset2=y %then %do;
        %if %symexist(dataset2) %then %do;
            data temp_dataset2;
            set work.df2;
            run;
        %end;
    %end;
    
    %if &dataset3=y %then %do;
        %if %symexist(dataset3) %then %do;
            data temp_dataset3;
            set work.df3;
            run;
        %end;
    %end;
    
    /* Fusionar todos los conjuntos de datos */
    data final_dataset;
        set temp_dataset temp_dataset2 temp_dataset3;
        drop temp_:; /* descartar conjuntos de datos intermedios */
    run;
    
    %mend;
    

    En el código de la macro actualizado, las entradas de la macro son dataset1, dataset2, y dataset3 en lugar de df1, df2, y df3. Cada parámetro dataset puede tener un valor de y o n, dependiendo de si se necesita incluir en el análisis o no. La macro utiliza la condición %if para verificar si un parámetro dataset es y o no. Si un conjunto de datos se incluye en el análisis, la macro lee ese conjunto de datos y crea un conjunto de datos temporal utilizando las declaraciones data y set. Luego, los conjuntos de datos temporales se fusionan para crear el conjunto de datos final utilizando la declaración set. Finalmente, la declaración drop se utiliza para descartar los conjuntos de datos temporales intermedios.

    Para ejecutar la macro, podemos usar el siguiente código:

    %select_datasets(dataset1=y, dataset2=y, dataset3=y);
    

    Esto creará un conjunto de datos final que incluye información de los tres conjuntos de datos, de la siguiente manera:

    Name Surname Username Score
    A.    B.      bad     24
    B.    J.      none92  54
    Jenny B.      jben42  25
    S.    C.      btw     34
    H.    H.      hhhg241 64
    F.    B.      gd523  22
    H.    G.G.    df51  34
    

    Si queremos incluir solo dos conjuntos de datos, podemos ejecutar la macro con los parámetros de dataset correspondientes establecidos en y, de la siguiente manera:

    %select_datasets(dataset1=y, dataset2=y, dataset3=n);
    

    Esto creará un conjunto de datos final que incluye información solo de los dos primeros conjuntos de datos:

    Name Surname Username Score
    A.    B.      bad     24
    B.    J.      none92  54
    Jenny B.      jben42  25
    S.    C.      btw     34
    

    De manera similar, podemos ejecutar la macro con solo un conjunto de datos, de la siguiente manera:

    %select_datasets(dataset1=y, dataset2=n, dataset3=n);
    

    Esto creará un conjunto de datos final que incluye información solo del primer conjunto de datos:

    Name Surname Username Score
    A.    B.      bad     24
    B.    J.      none92  54
    

    En general, el código de la macro actualizado nos permite seleccionar dinámicamente conjuntos de datos y crear un conjunto de datos final que incluye información de los conjuntos de datos seleccionados. La macro puede manejar casos en los que hay dos o un conjunto de datos también.

Comments are closed.