Repetir una matriz N veces por filas: 4 enfoques comparados
Un miembro de la comunidad lanza una pregunta aparentemente simple: ¿cómo repetir una matriz N veces por filas? La pregunta desata una sesión de casi 3 horas con 4 enfoques distintos y una explicación magistral de Leo sobre cómo funciona REDUCE internamente.
Nacho responde primero con un enfoque basado en LAMBDA que concatena y separa:
``
=LAMBDA(_rango;_reps;
TEXTOANTES(
ENCOL(_rango & "|" & SECUENCIA(;_reps);; VERDADERO);
"|"
)
)
`
El truco: al concatenar cada valor con "|" y una SECUENCIA horizontal, se generan N copias de cada elemento. ENCOL los aplana y TEXTOANTES elimina el separador auxiliar.
John propone dos soluciones progresivas. Para repetir una sola fila, una elegancia en miniatura:
`
=SI(SECUENCIA(5); R7:T7)
`
SECUENCIA(5) genera 5 filas de TRUE, y SI(TRUE; fila) repite la fila en cada una. Para matrices completas (varias filas y columnas), la solución definitiva con ELEGIRFILAS:
`
=LET(
r; B3:F5;
f; FILAS(r);
ELEGIRFILAS(r; 1 + RESIDUO(SECUENCIA(5f) - 1; f))
)
`
SECUENCIA(5f) genera índices del 1 al 15 (5 repeticiones × 3 filas), RESIDUO(...;f) los cicla de 0 a 2, y 1+ los convierte en índices válidos para ELEGIRFILAS. Resultado: la matriz original repetida 5 veces. Sin bucles, sin acumuladores, rendimiento constante.
Leo muestra el enfoque clásico con REDUCE+APILARV:
`
=LET(
m; B2:F5;
n; 3;
EXCLUIR(
REDUCE(""; SECUENCIA(n); LAMBDA(a;b; APILARV(a; m)));
1
)
)
`
Pero añade una advertencia importante: se desaconseja usar REDUCE+APILAR para un número grande de repeticiones, ya que el acumulador crece en cada paso y el rendimiento se degrada. La fórmula de John con ELEGIRFILAS es más óptima.
Leo aprovecha para explicar en detalle el funcionamiento interno de REDUCE: el parámetro a (acumulador) arranca con el valor inicial (""), en cada iteración b toma el siguiente valor de la secuencia, y el resultado del LAMBDA reemplaza al acumulador. Al final, EXCLUIR(...;1) elimina la primera fila vacía del valor inicial. "El funcionamiento es muy parecido al bucle FOR TO NEXT", explica.
John remata con una variante que genera encabezados dinámicos automáticamente:
`
=LET(
m; B2:F5;
n; 3;
REDUCE(
"Columna" & SECUENCIA(;COLUMNAS(m));
SECUENCIA(n);
LAMBDA(a;b; APILARV(a; m))
)
)
`
Aquí el valor inicial del REDUCE no es vacío sino una fila de encabezados generados con "Columna" & SECUENCIA(;COLUMNAS(m))`, que produce "Columna1", "Columna2", etc.
Un hilo que empieza con una pregunta sencilla y acaba siendo una clase magistral sobre rendimiento de fórmulas matriciales.
El problema
Una pregunta aparentemente inocente encendió un hilo de casi tres horas en la comunidad: ¿cómo repetir una matriz N veces, apilándola por filas? Es decir, si tienes un bloque de datos y quieres cinco copias consecutivas, una debajo de otra. Aparecieron cuatro enfoques y, de propina, una explicación magistral de cómo funciona REDUCE por dentro.
Enfoque 1: concatenar y separar (Nacho)
La primera respuesta juega con texto: concatena cada valor con un separador y una SECUENCIA horizontal para generar N copias, y luego las aplana con ENCOL y limpia el separador con TEXTOANTES. Ingenioso, aunque pensado sobre todo para repetir valores sueltos.
Enfoque 2: la elegancia de John
Para repetir una sola fila, difícil superar esto:
=SI(SECUENCIA(5); R7:T7)SECUENCIA(5) genera cinco filas de VERDADERO y SI(VERDADERO; fila) reproduce la fila en cada una. Y para matrices completas, la solución definitiva con ELEGIRFILAS:
=LET(
r; B3:F5;
f; FILAS(r);
ELEGIRFILAS(r; 1 + RESIDUO(SECUENCIA(5*f) - 1; f))
)SECUENCIA(5*f) genera los índices, RESIDUO(...;f) los cicla dentro del tamaño de la matriz y 1+ los ajusta a índices válidos. Resultado: la matriz repetida cinco veces, sin bucles ni acumuladores y con rendimiento constante.
Enfoque 3: el clásico REDUCE + APILARV (Leo)
=LET(
m; B2:F5;
n; 3;
EXCLUIR(REDUCE(""; SECUENCIA(n); LAMBDA(a;b; APILARV(a; m))); 1)
)Funciona, pero Leo añade una advertencia de oro: conviene evitar REDUCE + APILARV para muchas repeticiones, porque el acumulador crece en cada paso y el rendimiento se degrada. Para volúmenes grandes, la fórmula de John con ELEGIRFILAS es más óptima.
La clase magistral sobre REDUCE
Leo aprovecha para explicar el motor de REDUCE: el parámetro a (acumulador) arranca con el valor inicial, en cada vuelta b toma el siguiente elemento de la secuencia y el resultado de la LAMBDA sustituye al acumulador. Al terminar, EXCLUIR(...;1) retira la fila vacía inicial. "El funcionamiento es muy parecido al bucle FOR TO NEXT", resume. Como remate, muestra una variante que arranca el acumulador con una fila de encabezados generada con "Columna" & SECUENCIA(;COLUMNAS(m)), para etiquetar el resultado automáticamente.
Funciones clave
SECUENCIA: genera los índices y las repeticiones.ELEGIRFILAS: selecciona filas por índice, el corazón de la solución óptima.RESIDUO: cicla los índices dentro del tamaño de la matriz.REDUCEyAPILARV: el patrón clásico para acumular, con matices de rendimiento.ENCOLyTEXTOANTES: la vía basada en texto.
Conclusión
Lo que empezó como una duda de una línea acabó siendo una lección sobre rendimiento de fórmulas matriciales. La moraleja: en el Excel moderno casi siempre hay más de un camino, y elegir el bueno —ELEGIRFILAS frente a REDUCE acumulativo— marca la diferencia cuando los datos crecen. Este tipo de debates, con varias mentes puliendo la misma idea, son la esencia de la comunidad de Influexcel.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Distribución equitativa con LAMBDA, REDUCE y ALEATORIO CasoHéctor plantea la necesidad de repartir un conjunto de líneas (tareas, actividades) entre varios grupos de forma equitativa y aleatoria. Ide
- 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
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Cálculos iterativos con REDUCE y APILARV en Excel CasoLa comunidad aborda un caso sobre cómo trabajar con bucles iterativos en Excel usando funciones modernas. Un miembro necesita realizar cálcu
- Repetir valores N veces: tres enfoques con REDUCE, SCAN y ARCHIVOMAKEARRAY CasoJoan Recasens plantea un problema clásico: tiene una lista de categorías (A, B, C) con el número de repeticiones de cada una (4, 2, 3) y qui
- Reducir un número a un dígito con LAMBDA recursiva y secuencia intermedia CasoJoan Recasens plantea un reto matemático: reducir un número a un solo dígito sumando sus cifras de forma recursiva, y además guardar toda la
- 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á
- REDUCE de CERO a PRO TutorialCon REDUCE podrás transformar listas simples en análisis completos y automatizar cálculos que antes parecían imposibles. Si trabajas con dat
- Eliminar celdas vacías al concatenar con DIVIDIRTEXTO y BYROW CasoJuan plantea lo que parece una duda sencilla: tiene filas con valores y celdas vacías intercaladas, y necesita concatenar solo los valores n
- 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