Readmisión de pacientes en 48h: Power Query, LAMBDA/MAP y AGRUPARPOR

Andrés Rojas plantea un reto real de datos clínicos: a partir de una tabla con más de un millón de registros de urgencias (IdPaciente, Fecha, DiagnósticoCIE10), necesita identificar qué pacientes reingresaron en urgencias dentro de las 48 horas siguientes a una visita anterior.

Tres enfoques muy distintos aparecen en minutos:

Toni Jurado con Power Query — agrupa por paciente, añade índices para hacer self-join y filtra por diferencia de fechas:

``
let
Source = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
Grouped = Table.Group(Source, {"IdPaciente"}, {{"Datos", each _, type table}}),
Indexed = Table.TransformColumns(Grouped, {"Datos", each Table.AddIndexColumn(_, "Idx", 0, 1)}),
Expanded = Table.ExpandTableColumn(Indexed, "Datos", {"Fecha urgencia", "Dx CIE10", "Idx"}),
Joined = Table.NestedJoin(Expanded, {"IdPaciente", "Idx"}, Expanded, {"IdPaciente", "Idx"}, "Next", JoinKind.Inner),
// ... filtro Duration.TotalHours <= 48
in
Result
`

Nacho con LAMBDA + MAP + FILTRAR — recorre cada paciente y busca la diferencia mínima con su siguiente visita:

`
=LAMBDA(TablaDatos;
LET(
pacientes; INDICE(TablaDatos;;1);
fechas; INDICE(TablaDatos;;2);
diagnosticos; INDICE(TablaDatos;;3);
MAP(pacientes; fechas; diagnosticos;
LAMBDA(_p; _f; _d;
MAX(FILTRAR(fechas; (pacientes=_p)(fechas>_f)(fechas-_f<=2)))
)
)
)
)(Tabla1)
`

Andrés con AGRUPARPOR — la más avanzada, combina agrupación y filtrado en una sola fórmula:

`
=LET(
idP; Tabla1[IdPaciente];
fur; Tabla1[Fecha urgencia];
dxc; Tabla1[Dx CIE10];
mbo; AGRUPARPOR(idP; fur;
LAMBDA(fe; SI.ERROR(O(EXCLUIR(fe;-1)-EXCLUIR(fe;1)<=2); FALSO));
0; 0
);
idU; FILTRAR(TOMAR(mbo;;1); TOMAR(mbo;;-1));
indices; BYROW(idP=ENFILA(idU); O);
grupo; AGRUPARPOR(
FILTRAR(APILARH(idP;dxc); indices);
FILTRAR(fur; indices);
LAMBDA(fe; LET(
dif; fe-ENFILA(fe);
MIN(SI((dif>0)*(dif<=2); dif))
));
0; 0
);
FILTRAR(grupo; TOMAR(grupo;;-1))
)
`

La fórmula de Andrés procesa 1M+ filas en ~13 segundos. Primero identifica qué pacientes tienen alguna readmisión en 48h (AGRUPARPOR con EXCLUIR` para comparar fechas consecutivas), luego filtra solo esos pacientes y calcula la diferencia exacta.

Detectar reingresos hospitalarios en 48 horas con más de un millón de filas

Andrés Rojas lanzó un reto de datos clínicos con mucha miga: partiendo de una tabla de urgencias con más de un millón de registros (IdPaciente, Fecha, Diagnóstico CIE10), identificar qué pacientes volvieron a urgencias dentro de las 48 horas siguientes a una visita previa. En minutos aparecieron tres enfoques muy distintos.

Enfoque 1: Power Query con self-join

Toni Jurado lo resolvió agrupando por paciente y añadiendo un índice a cada grupo para poder hacer un self-join (la tabla contra sí misma, desplazada una posición). Al unir cada visita con la siguiente del mismo paciente, basta calcular la diferencia de fechas y quedarse con las que caen dentro de las 48 horas. Es un patrón muy legible y mantenible, ideal si ya trabajas tu modelo en Power Query.

Enfoque 2: LAMBDA + MAP + FILTRAR

Nacho recorrió cada paciente buscando su siguiente visita dentro de la ventana de dos días:

`` =LAMBDA(TablaDatos; LET( pacientes; INDICE(TablaDatos;;1); fechas; INDICE(TablaDatos;;2); diagnosticos; INDICE(TablaDatos;;3); MAP(pacientes; fechas; diagnosticos; LAMBDA(_p; _f; _d; MAX(FILTRAR(fechas; (pacientes=_p)(fechas>_f)(2>=fechas-_f))) ) ) ) )(Tabla1) ``

Para cada fila, FILTRAR se queda con las fechas del mismo paciente posteriores a la actual y separadas como mucho dos días; MAX devuelve la más cercana. La condición se construye multiplicando máscaras booleanas: mismo paciente, fecha posterior y diferencia dentro de la ventana.

Enfoque 3: AGRUPARPOR (el más rápido)

Andrés remató con la versión más avanzada, combinando agrupación y filtrado en una sola pasada con AGRUPARPOR. Primero marca qué pacientes tienen alguna readmisión en 48 horas comparando fechas consecutivas dentro de cada grupo (con EXCLUIR para desplazar el vector de fechas), y luego filtra solo esos pacientes para calcular la diferencia exacta. El dato impresiona: procesa más de un millón de filas en unos 13 segundos.

Funciones clave

  • AGRUPARPOR: agrupa por paciente y aplica una LAMBDA de resumen a cada grupo; la clave del rendimiento.
  • MAP y FILTRAR: recorren paciente a paciente y aíslan las visitas candidatas.
  • EXCLUIR: desplaza el vector de fechas para comparar cada visita con la contigua.
  • Máscaras booleanas: multiplicar condiciones (mismo paciente por fecha posterior por ventana de días) filtra sin SI anidados.

Conclusión

Tres velocidades y tres estilos para el mismo problema real: Power Query prioriza la legibilidad, LAMBDA+MAP la expresividad y AGRUPARPOR el rendimiento bruto sobre volúmenes enormes. Elegir depende de con qué te sientas cómodo y del tamaño de tus datos. Casos como este, con datos clínicos de verdad, son los que se cuecen a diario en la comunidad de InflueXcel.

Más contenido de Excel en InflueXcel