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 casos con estas funciones
Más contenido de Excel en InflueXcel
- Error #CALC! con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- Filtro multicriteria dinámico con LET, FILTRAR y LAMBDA CasoHéctor comparte con la comunidad una fórmula avanzada para filtrar una tabla de productos/servicios por múltiples criterios opcionales (clav
- Buscar prefijos de longitud variable en otra columna: BYROW, MAP, REGEX y COINCIDIRX CasoInteresante problema planteado por un miembro: tiene una columna A con ~1.200 referencias de longitud variable y una columna C con ~276 text
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Reto de agrupación y pivotado: AGRUPARPOR vs ARCHIVOMAKEARRAY vs MAP CasoLeandro trae un reto de internet al grupo: a partir de una tabla con claves repetidas y valores, generar una tabla pivotada donde cada clave
- Filtrar filas con todos los valores a cero: 4 enfoques con FILTRAR y BYROW CasoJuan tiene una tabla grande donde muchas filas contienen solo ceros y necesita filtrarlas para quedarse solo con las que tienen datos reales
- Filtrar con múltiples condiciones usando matrices booleanas y BYROW CasoInteresante problema planteado por un miembro sobre cómo filtrar datos que cumplan varias condiciones simultáneas usando operaciones matrici
- ¿MAP o BYROW? Descubre cuándo usar cada una Tutorial¿MAP o BYROW? Descubre cuándo usar cada una y cómo estas funciones pueden transformar tu forma de trabajar en Excel. En este vídeo aprenderá
- Power Query: rutas dinámicas para compartir ficheros sin romper conexiones CasoUn miembro de la comunidad plantea un problema muy frecuente: tiene una consulta de Power Query con una ruta de red fija (\\servidor\shared-
- Evitar 1/1/1900 al apilar tablas con fechas vacías usando APILARV CasoFernando tiene varias tablas auxiliares que combina con APILARV en una tabla resumen. El problema: cuando un campo de fecha está vacío, apar