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.
  • REDUCE y APILARV: el patrón clásico para acumular, con matices de rendimiento.
  • ENCOL y TEXTOANTES: 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