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 unaLAMBDAde resumen a cada grupo; la clave del rendimiento.MAPyFILTRAR: 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
SIanidados.
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
- Cuenta clientes y cervezas en Excel 🍺 Caso "La Taberna: El Poney Pisador" (Nivel 1) Tutorial🍺 Noche cerrada en Bree. Frodo, Sam, Merry y Pippin cruzan la puerta de El Poney Pisador huyendo de los Jinetes Negros: la sala está a reven
- SUMAR.SI.CONJUNTO en acción con El Señor de los Anillos 🃏 El 21 de La Comarca TutorialLo que practicamos en este caso: • Contar cartas por palo con CONTAR.SI • Sumar valores con condiciones (SUMAR.SI / SUMAR.SI.CONJUNTO) • Apl
- Reto de Excel: El cumpleaños de Bilbo 🎂 | CONTAR.SI y SUMAR.SI desde cero (Nivel 1) TutorialEn La Comarca se celebra el cumpleaños número 111 de Bilbo Bolsón: cerveza, pasteles, fuegos artificiales… y algún curioso escondido tras el
- ¡Excel PowerQuery Hack! Conexiones con rutas relativas en 10 minutos! Tutorial¿Harto de ajustar las conexiones en PowerQuery cada vez que compartes tu archivo de Excel? 🙄 Convierte las conexiones de PowerQuery con ruta
- Mejora un 90% el rendimiento de Power Query con SQLite TutorialPower Query es una herramienta potente para consolidar, combinar y calcular datos, pero cuando trabajamos con millones de registros y calcul
- Reorganizar tablas mensuales: cruzar por persona buscando en vertical y en horizontal CasoNuevo caso interesante de la comunidad. Juan tenía varias tablas mensuales (a veces más de una en el mismo mes) y quería reorganizarlas por
- Un dato de todas las hojas, escrito una sola vez CasoEsta semana surgió en la comunidad un reto muy habitual cuando un libro tiene muchas hojas: mostrar el valor de la celda B3 de cada hoja, in
- Un índice de hojas que se genera solo: HYPERLINK en rangos desbordados CasoEsta semana surgió en la comunidad un pequeño "expediente X". Un miembro llegó tras ver un vídeo con una idea clara en la cabeza: montar una
- Reformatear un código alfanumérico al teclear: de NN1234567 a NN-12345-67 CasoEsta semana surgió en la comunidad una duda muy práctica: cómo conseguir que al escribir un código tipo NN1234567 (dos letras seguidas de si
- Reclasificación contable: duplicar cada fila con una conversión distinta por columna, en un único bloque CasoInteresante reto contable planteado esta semana por un miembro de la comunidad. Juan parte de una tabla de apuntes contables (rango C7:P10)