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.

Comparando valores entre filas y luego eliminando los valores duplicados en SAS.

Tengo un conjunto de datos que tiene ciertas variables, ahora tengo que comparar esas variables entre filas para encontrar los duplicados, pero tiene algunas solicitudes adicionales.

  • Si para la misma acctnum y testid
  • Si el finalamt coincide con el finalamt de la siguiente fila y el finalamtagregado coincide con el finalamtagregado de la siguiente fila, debemos considerarlos como duplicados y eliminar solo el caso donde la tran_date esté en blanco.

  • También, si estamos eliminando la fila duplicada con la trandate en blanco, los datos actual_ amt de esa fila deben conservarse como una nueva variable actamtextra en la fila que no se eliminó.

He intentado múltiples escenarios usando lag y retain, pero los datos simplemente no están llegando correctamente. Agradeceré cualquier ayuda.

Los datos que quiero son:

data want;
input acct_num test_id tran_date:anydtdte. actual_amt final_amt final_amt_added act_amt_extra;
format tran_date date9.;
DATALINES;
55203610 2542 12-jan-20 30 45 45
16124130 8062 14-dec-19 8 78 78 56
80479512 2062 19-mar-19 32 32 32
70321918 2062 20-dec-19 1 93 54
17312410 6712 15-jun-18 0 90 90 45
74623123 2092 17-aug-18 34 87 87
24245321 2082 22-jan-17 22 56 67
;
run;

Los datos de muestra son:

DATA work.sample;
INPUT acct_num test_id tran_date:anydtdte. actual_amt final_amt final_amt_added ;
format tran_date date9.;
DATALINES;
55203610 2542 12-jan-20 30 45 45
16124130 8062 . 56 78 78
16124130 8062 14-dec-19 8 78 78
80479512 2062 19-mar-19 32 32 32
70321918 2062 20-dec-19 1 93 54
17312410 6712 . 45 90 90
17312410 6712 15-jun-18 0 90 90
74623123 2092 17-aug-18 34 87 87
24245321 2082 22-jan-17 22 56 67
;
run;

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para comparar las variables entre filas y encontrar los duplicados con las condiciones dadas, puede utilizar técnicas avanzadas de SAS en el paso de datos como retain, lag y declaraciones if-then. Aquí hay una forma de lograr la salida deseada:

    /* Ordena el conjunto de datos por acct_num, test_id y tran_date */
    proc sort data=work.sample;
      by acct_num test_id tran_date;
    run;
    
    /* Crea un nuevo conjunto de datos con las variables deseadas */
    data want;
      /* Declarar todas las variables con valores iniciales */
      length prev_acct_num 8 prev_test_id 8 prev_final_amt 8 prev_final_amt_added 8;
      length act_amt_extra 8;
      retain prev_acct_num prev_test_id prev_final_amt prev_final_amt_added .;
    
      set work.sample;
    
      /* Compara la fila actual con la fila anterior */
      if acct_num = prev_acct_num and test_id = prev_test_id then do;
        if final_amt = prev_final_amt and final_amt_added = prev_final_amt_added then do;
          /* Comprueba la condición para eliminar la fila duplicada */
          if missing(tran_date) then do;
            /* La fila actual es un duplicado, asigna el monto real a una nueva variable */
            act_amt_extra = actual_amt;
            /* No emita la fila actual, salte a la siguiente iteración */
            continue;
          end;
        end;
      end;
    
      /* Si la fila actual no es un duplicado, emítala y actualice los valores anteriores */
      output;
      prev_acct_num = acct_num;
      prev_test_id = test_id;
      prev_final_amt = final_amt;
      prev_final_amt_added = final_amt_added;
    run;
    

    En este código, retain se usa para almacenar los valores de la fila anterior y se utilizan declaraciones if-then para comparar las variables entre filas y aplicar las condiciones deseadas. La función missing() se utiliza para verificar si la variable tran_date está en blanco. La variable act_amt_extra recibe el valor de actual_amt de la fila duplicada. La instrucción continue se utiliza para saltar a la siguiente iteración sin emitir la fila actual. Finalmente, la instrucción output se utiliza para emitir la fila actual si no es un duplicado, y los valores de la fila actual se almacenan en variables prev_ para usarlos en la próxima iteración.

Comments are closed.