Hola, esta es una muestra de mis datos (hay una columna adicional de LBCAT = URINALYSIS para ese panel de pruebas)

Sample Data

Se me ha pedido que solo incluya el panel de pruebas donde se completa LBNRIND para cualquiera de esas pruebas y el resto se eliminará. Algunos sujetos tienen múltiples resultados de pruebas en diferentes puntos de visita y otros solo tienen 1. No puedo utilizar un lugar simple donde LBNRIND ne '' en el paso de datos porque necesito todo el panel de pruebas de análisis de orina y no solo ese resultado de prueba en particular. ¿Cuál sería el mejor enfoque aquí? Creo que transponer los datos sería demasiado complicado, pero ¿tal vez poner las variables en una matriz / macro y utilizar un bucle do para ese panel de pruebas?

Actualización: probé este código pero no mantiene las pruebas correspondientes donde lb_nrind> 0. Si aplico la suma (lb_nrind> '') lo mismo cuando aplico lb_nrind> '' a la cláusula having

*proc sql; 

*create table want as 
select * from labUA 
group by ptno and day and lb_cat
having sum(lb_nrind > '') > 0   ; 

data want2;
do _n_ = 1 by 1 until (last.ptno);
set labUA;
by ptno period day hour ;
if not flag_group then flag_group = (lb_nrind > '');
end;   

do _n_ = 1 to _n_; 
set want; 
if flag_group then output;
end;   

drop flag_group; run;*
sas
0
smackersz88 11 mar. 2021 a las 20:00

1 respuesta

La mejor respuesta

Puede usar una cláusula SQL HAVING para retener filas de un grupo que cumpla alguna condición agregada. En su caso, ese grupo podría ser un patientid, panelid y condicionar al menos un LBNRIND not NULL

Ejemplo:

Considere este ejemplo en el que un grupo de filas debe mantenerse solo si al menos una de las filas del grupo cumple con los criterios result7=77

Ambos bloques de código utilizan la función SAS de que una evaluación lógica es 1 para verdadero y 0 para falso .

SQL

data have;
  infile datalines missover;
  input id test $ parm $ result1-result10;
  datalines;
1 A P 1 2 . 9 8 7 . . . .
1 B Q 1 2 3
1 C R 4 5 6
1 D S 8 9 . . . 6 77
1 E T 1 1 1
1 F U 1 1 1
1 G V 2
2 A Z 3
2 B K 1 2 3 4 5 6 78
2 C L 4
2 D M 9
3 G N 8
4 B Q 7
4 D S 6
4 C 1 1 1 . . 5 0 77
;

proc sql;
  create table want as 
  select * from have
  group by id
  having sum(result7=77) > 0
  ;

Bucle DOW

data want;
  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;
    if not flag_group then flag_group = (result7=77);
  end;

  do _n_ = 1 to _n_;
    set have;
    if flag_group then output;
  end;

  drop flag_group;
run;
1
Richard 12 mar. 2021 a las 12:43