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: Comparar valores de matriz con valores de variables

Tengo un problema extraño que intento resolver con un array. Aquí está la cosa:
tengo este conjunto de datos:

Imagen

Variable Code es un identificador para un tipo de gasto. Amount es el monto del gasto.
Lo que me gustaría hacer es crear una columna para cada código y poner el monto del gasto en ella.

Imagen

He intentado diferentes cosas para obtener estos resultados con un array, que se ve así:

data Want;

    set Have;

    array _Code{*} 3MC 7MC 7GI 7GT;
    do i = 1 to dim (_Code); 
    if code=_Code{i} then _Code{i}=Amount ; 
    end; 

run; 

¿Alguien tiene alguna idea de cómo puedo solucionar esto?
¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para crear nuevas columnas usando arrays

    Para crear una nueva columna para cada código y colocar el monto del gasto en ella, podemos utilizar el siguiente código SAS:

    data Quiero;
        set Tengo;
        array _Codigo(3MC-7GT) _temporary_;
        _Codigo(Codigo)=Monto;
        drop Codigo Monto;
        rename _Codigo(3MC)='3MC'
               _Codigo(7MC)='7MC'
               _Codigo(7GI)='7GI'
               _Codigo(7GT)='7GT';
    run;
    

    La sentencia array crea un array temporal _Codigo con las variables 3MC-7GT, que son los posibles valores de Codigo.

    La opción _temporary_ indica que el array no es permanente y se destruirá cuando finalice el paso de datos.

    La sentencia _Codigo(Codigo)=Monto asigna el Monto al elemento correspondiente del array _Codigo, utilizando el valor de la variable Codigo como índice.

    La sentencia drop Codigo Monto elimina las variables originales.

    Por último, la sentencia rename cambia los nombres de las variables según los códigos.

    Este código debería producir la salida deseada, como se muestra en la segunda tabla (Quiero) de la pregunta.

Comments are closed.