Tengo una función FLATTEN LAMBDA que aplana los datos en una matriz. Esto funciona bien, pero quiero integrar otro argumento de matriz para poder usar rangos no contiguos.
En mi ejemplo, el rango A1:B6 está alojado en array y devuelve los datos aplanados.
¿Cómo puedo incluir un argumento array2 que acepte D1:D6 como un rango adicional?
Fórmula:
FLATTEN = LAMBDA(array, LET( rows,ROWS(array), columns,COLUMNS(array), sequence,SEQUENCE(rows*columns), quotient,QUOTIENT(sequence-1,columns)+1, mod,MOD(sequence-1,columns)+1, INDEX(IF(array="","",array),quotient,mod) ) )Editar 04/07/22 :
ms365 ahora ha introducido una función llamada VSTACK() y TOCOL() que permite la funcionalidad que nos faltaba en FLATTEN() de GS (y funciona aún mejor)
En su caso, la fórmula podría convertirse en:
=TOCOL(A1:D6,1) Y esa pequeña fórmula (donde el segundo parámetro le dice a la función que ignore las celdas vacías) reemplazaría todo lo demás desde abajo aquí. Si C1:C6 tuviera valores que no desea incorporar, puede probar cosas como:
=VSTACK(TOCOL(A1:B6),D1:D6)Respuesta anterior :
Realmente no puede crear un LAMBDA() con un número desconocido (de antemano) de matrices para incluir en aplanar. El hecho de que tenga matrices de varias columnas contribuirá a la "complicación". Una forma de 'aplanar' varias columnas de esta manera específica sería:
Fórmula en G1 :
=LET(X,CHOOSE({1,2,3},A1:A6,B1:B6,D1:D6),Y,COLUMNS(X),Z,SEQUENCE(COUNTA(X)),INDEX(X,CEILING(Z/Y,1),MOD(Z-1,Y)+1))EDITAR: según su comentario, puede extender esto como tal:
=LET(X,CHOOSE({1,2,3},IF(A1:A6="","",A1:A6),IF(B1:B6="","",B1:B6),IF(D1:D6="","",D1:D6)),Y,COLUMNS(X),Z,SEQUENCE(ROWS(X)*Y),FLAT,INDEX(X,CEILING(Z/Y,1),MOD(Z-1,Y)+1),FILTER(FLAT,FLAT<>""))Es una trampa, pero:
FLATTEN = LAMBDA(array, LET( rows,ROWS(array), columns,COLUMNS(array), sequence,SEQUENCE(rows*columns), quotient,QUOTIENT(sequence-1,columns)+1, mod,MOD(sequence-1,columns)+1, unpiv, INDEX(array,quotient,mod), FILTER(unpiv, unpiv<>"") ) )Donde su matriz se ha extendido a A1: D6 como entrada.
Creo que la respuesta de JvdV será la mejor según el formato de entrada que desee, pero ya había escrito esto, así que aquí va...
Podrías hacerlo:
=LET( array1, A1:B6, array2, D1:D6, rows1,ROWS(array1), rows2,ROWS(array2), columns1,COLUMNS(array1), columns2,COLUMNS(array2), rows, MIN(rows1, rows2), columns, columns1 + columns2, sequence,SEQUENCE(rows*columns), quotient,QUOTIENT(sequence-1,columns)+1, mod,MOD(sequence-1,columns)+1, IFERROR(INDEX( IF( ISBLANK(array1),"",array1),quotient,mod), INDEX(IF( ISBLANK(array2),"",array2),quotient,MOD(sequence-1,columns2)+1) ) )Tomará entradas de varias columnas/filas para ambas matrices.
A partir del artículo aquí y actualizándolo en función de las observaciones sobre los valores vacíos en las matrices y permitiendo matrices de diferentes tamaños, podemos obtener dos fórmulas que debería poder traducir a funciones Named LAMBDA con nombre para matrices de "apilamiento" y "estantería".
Matrices apiladas
=LET(rngA, A1:C5, rngB, A9:D11, rowsA, ROWS(rngA), rowsB, ROWS(rngB), NumCols, MAX(COLUMNS(rngA), COLUMNS(rngB)), SeqRow, SEQUENCE(rowsA + rowsB), SeqCol, SEQUENCE(1, NumCols), Result, IF(SeqRow <= rowsA, INDEX(IF(rngA="","",rngA), SeqRow, SeqCol), INDEX(IF(rngB="","",rngB), SeqRow-rowsA, SeqCol)), arr, IFERROR(Result,""), arr)Arreglos de estantes
=LET(rngA, A1:C5, rngB, B8:D12, colsA, COLUMNS(rngA), colsB, COLUMNS(rngB), NumRows, MAX(ROWS(rngA), ROWS(rngB)), SeqRow, SEQUENCE(NumRows), SeqCol, SEQUENCE(1, colsA + colsB), Result, IF(SeqCol <= colsA, INDEX(IF(rngA="","",rngA), SeqRow, SeqCol), INDEX(IF(rngB="","",rngB), SeqRow, SeqCol-colsA ) ), arr, IFERROR(Result,""), arr)Una vez que tenga una matriz contigua, puede aplicar la fórmula que ya tiene:
Actualizado para usar un rango de derrame para facilitar las pruebas...
=LET(data, A1#, rows, ROWS(data), cols, COLUMNS(data), seq, SEQUENCE(rows*cols,,0), list, INDEX(IF(data="", "", data), QUOTIENT(seq, cols)+1, MOD(seq, cols)+1), FILTER(list, LEN(list)>0)) Este enfoque está realmente orientado hacia las funciones named LAMBDA porque, de lo contrario, terminará con fórmulas monstruosas y los otros enfoques pueden ser mejores en ese caso.