Limitación de BYCOL: cómo obtener múltiples valores por columna

Surge una duda sobre por qué una fórmula aparentemente simple con BYCOL genera error. El usuario intenta obtener los 5 mayores valores de cada columna de un rango numérico:

``
=APILARH(BYCOL(A1:X100; LAMBDA(col; K.ESIMO.MAYOR(col; {1;2;3;4;5}))))
`

Leo identifica el problema rápidamente: BYCOL no es capaz de devolver más de un elemento por columna. Para que funcione, la función LAMBDA debe producir un único valor escalar por cada columna procesada.

Gerson propone una solución ingeniosa usando UNIRCADENAS para consolidar los valores en un solo texto separado por comas:

`
=APILARH(BYCOL(A1:X100;LAMBDA(col;UNIRCADENAS(",";; K.ESIMO.MAYOR(col;{1;2;3})))))
`

Y si solo se necesita un valor por columna (por ejemplo el máximo), la fórmula se simplifica enormemente:

`
=BYCOL(A1:X100;MAX)
`

Gerson también señala que en el caso de querer un solo valor, el APILARH es innecesario. Leo menciona REDUCE como alternativa para los casos en que se necesiten múltiples resultados por columna sin la limitación de BYCOL.

Un caso útil para entender las limitaciones de las funciones BYROW y BYCOL` (ambas devuelven un único valor por iteración) y las alternativas disponibles.

Quieres los cinco valores más altos de cada columna de un rango. Escribes un BYCOL con K.ESIMO.MAYOR, parece razonable, y Excel te devuelve un error. La explicación de Leo en la comunidad aclara una limitación de BYCOL y BYROW que conviene tener grabada.

El problema

La fórmula de partida era esta:

=APILARH(BYCOL(A1:X100; LAMBDA(col; K.ESIMO.MAYOR(col; {1;2;3;4;5}))))

La idea se entiende perfectamente: recorrer cada columna, y para cada una pedir el primero, segundo, tercero, cuarto y quinto mayor mediante una constante matricial. El resultado esperado sería una tabla de 5 filas por tantas columnas tenga el rango.

La causa: BYCOL devuelve un valor por columna

Leo identifica el problema al instante: BYCOL no puede devolver más de un elemento por columna. La LAMBDA que le pasas tiene que producir un único valor escalar en cada iteración.

Y K.ESIMO.MAYOR con una constante matricial de cinco posiciones devuelve cinco valores. BYCOL no tiene forma de encajar eso en su matriz de salida.

Lo mismo vale para BYROW: una LAMBDA por fila, un valor por fila. Ambas están pensadas para reducir cada línea a un dato, no para expandirla.

Merece la pena recordar el reparto de papeles entre las funciones de matriz:

  • BYROW y BYCOL reducen: muchos valores dentro, uno fuera
  • MAP transforma elemento a elemento, también con un valor de salida por cada entrada
  • REDUCE acumula y es la única que admite resultados de tamaño variable

Solución 1: consolidar los valores en un texto

Gerson propone una salida elegante cuando lo que quieres es ver los valores, no operar con ellos: unirlos en una sola cadena separada por comas, de forma que la LAMBDA sí devuelva un escalar.

=APILARH(BYCOL(A1:X100; LAMBDA(col; UNIRCADENAS(","; ; K.ESIMO.MAYOR(col; {1;2;3})))))

UNIRCADENAS recibe los tres mayores de la columna y los colapsa en un único texto. BYCOL ya está contento, porque cada iteración produce un valor.

Es una técnica muy práctica para informes de un vistazo. La contrapartida es evidente: el resultado es texto, y si luego necesitas calcular con esos números tendrás que volver a trocearlos.

Solución 2: si solo necesitas un valor, simplifica

Gerson señala además algo que se pasa por alto con facilidad. Si lo que quieres es un solo dato por columna (el máximo, por ejemplo), la fórmula se reduce a su mínima expresión:

=BYCOL(A1:X100; MAX)

Sin LAMBDA y sin APILARH. Fíjate en dos detalles:

  • Puedes pasar el nombre de la función directamente como segundo argumento, sin envolverlo en LAMBDA, siempre que solo reciba un argumento
  • El APILARH de la fórmula original era innecesario: BYCOL ya devuelve una fila de resultados con la forma correcta

Ese APILARH sobrante es un síntoma habitual cuando una fórmula ha ido creciendo a base de parches.

Solución 3: REDUCE para múltiples valores reales

Cuando de verdad necesitas los cinco mayores como números y no como texto, Leo apunta a REDUCE. Al arrastrar un acumulador, permite ir apilando bloques de cualquier tamaño con APILARH o APILARV, columna a columna, hasta construir la tabla completa.

Es más verboso que BYCOL, pero es la herramienta correcta para el trabajo: la única de la familia que no impone un valor por iteración.

Funciones clave

  • BYCOL — recorre columnas; exige un valor escalar por columna
  • BYROW — misma limitación, aplicada a filas
  • K.ESIMO.MAYOR — devuelve el n-ésimo mayor; admite una constante matricial para pedir varios de golpe
  • UNIRCADENAS — colapsa varios valores en un texto para satisfacer a BYCOL
  • REDUCE — la alternativa cuando el resultado por iteración tiene tamaño variable
  • MAX — recuerda que puedes pasarla directamente como función, sin LAMBDA

Conclusión

Ante un error con BYROW o BYCOL, la pregunta que resuelve el 90% de los casos es: cuántos valores devuelve mi LAMBDA. Si son más de uno, o lo colapsas en un texto o cambias a REDUCE.

Casos como este surgen a diario en la comunidad de InflueXcel, donde una duda de tres líneas acaba explicando cómo está diseñada toda una familia de funciones.

Más casos con estas funciones

Más contenido de Excel en InflueXcel