Как объединить несколько пар столбцов в одну таблицу (с нулями для отсутствующих значений)?

У меня есть много пар столбцов (данные масс-спектра), которые я хочу объединить в один массив с нулями для недостающих строк.

У меня есть что-то вроде этого:

пары столбцов

Масса 10 Масса 11 Масса 12 Масса 13 80 22005 г. 81 30908 81 46532 80 22259 81 33306 82 47792 82 97559 81 42002 82 27314 84 1315498 83 35698 82 233130 83 27204 85 110460 84 2391605 84 6892485 84 644196 86 25905 86 51365 85 502763 85 54723 87 31240 87 34415 86 37660 86 28384 88 22801 88 21819 87 40078 87 32212 90 24878 89 25326 88 39850 88 38615 91 36830 90 30998 89 44535 89 13155 92 27189 92 28916 90 38188 90 20406 93 29146 93 19224 92 31855 95 22505 94 31359 93 18951 96 18047 95 22533 94 37879 97 97665 96 28238 95 38750 97 132143 96 16119 98 18459 97 171050 99 17121 98 23113 101 9579 99 34733 102 235454 100 23821 103 25700 101 28792 104 17415 102 442859 105 28789 103 28505 106 16005 104 14448 107 17534 106 22950 108 24548 107 25922 108 29475 109 15177 110 123036 111 30295 112 18465 113 52162 114 19906 г. 115 64107 116 60852

... и я хочу иметь что-то вроде этого:

комбинированный массив

Масса 10 11 12 13 80 22005 г. 0 0 22259 81 33306 30908 46532 42002 82 27314 47792 97559 233130 83 27204 0 35698 0 84 644196 1315498 2391605 6892485 85 54723 110460 0 502763 86 28384 25905 51365 37660 87 32212 31240 34415 40078 88 38615 22801 21819 39850 89 13155 0 25326 44535 90 20406 24878 30998 38188 91 0 36830 0 0 92 0 27189 28916 31855 93 0 29146 19224 18951 95 0 22505 22533 38750 96 0 18047 28238 16119 97 0 97665 132143 171050 94 0 0 31359 37879 98 0 0 18459 23113 99 0 0 17121 34733 101 0 0 9579 28792 102 0 0 235454 442859 103 0 0 25700 28505 104 0 0 17415 14448 105 0 0 28789 0 106 0 0 16005 22950 107 0 0 17534 25922 108 0 0 24548 29475 100 0 0 0 23821 109 0 0 0 15177 110 0 0 0 123036 111 0 0 0 30295 112 0 0 0 18465 113 0 0 0 52162 114 0 0 0 19906 г. 115 0 0 0 64107 116 0 0 0 60852

Я попробовал использовать сводный столбец, но это не сработало. Некоторое использование TOCOL может быть вариантом.

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
121
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Преобразование данных

=LET(data,A1:H11,na,0,
    s,SEQUENCE(COLUMNS(data)/2,,,2),
    sh,TAKE(data,1),
    dh,HSTACK(TAKE(sh,,1),CHOOSECOLS(sh,s+1)),
    sd,DROP(data,1),
    drl,SORT(UNIQUE(TOCOL(CHOOSECOLS(sd,s),1))),
    dd,DROP(REDUCE("",s,LAMBDA(rr,c,
        HSTACK(rr,XLOOKUP(drl,CHOOSECOLS(sd,c),
            CHOOSECOLS(sd,c+1),na)))),,1),
    VSTACK(dh,HSTACK(drl,dd)))

Переменные

s   - {1;3;5;7}
s+1 - {2;4;6;8}
sh  - A1:H1
sd  - A2:H11
dh  - J1:N1
drl - J2:J17
dd  - K2:N17

Масса 11 Масса 12 Масса 13 Масса 14 21 5381 24 6004 24 3391 19 4477 14 5939 21 8932 26 7270 13 7440 23 1855 г. 25 7809 15 7419 25 8175 23 9400 17 1035 19 3749 24 6855 17 4518 14 4876 21 3810 28 9400 13 8150 16 5418 23 3158 18 4676 21 9707 11 4962 10 9057 20 6584

Большое спасибо за Ваш ответ! Я попытался использовать вашу формулу с вашим MWE, но получил ошибку «С этой формулой возникла проблема». Я уверен, что мне нужно сделать что-то по-другому. Пожалуйста помоги!)))

lemann 23.04.2024 09:51

Это может означать, что разделителем списка является точка с запятой (;). Замените все запятые (,) на него (;).

VBasic2008 23.04.2024 09:53

К сожалению, у меня это не работает: LET(data,A1:H11,na,0, {1;3;5;7},SEQUENCE(COLUMNS(data)/2,,,2), A1:H1,TAKE (данные,1), J1:N1,HSTACK(TAKE(A1:H1,,1),ВЫБЕРИТЕ ECOLS(A1:H1,{2;4;6;8})), A2:H11,DROP(данные,1) , J2:J17,SORT(UNIQUE(TOCOL(ВЫБЕРИТЕ ЭКОЛОГИ(A2:H11,{1;3;5;7}),1))), K2:N17,DROP(REDUCE("",{1;3;5 ;7},LAMBDA(rr,c, HSTACK(rr,XLOOKUP(J2:J17,CHOOSECOLS(A2:H11,c), CHOOSECOLS(A2:H11,c+1),na)))),,1), VSTACK(J1:N1,HSTACK(J2:J17,K2:N17))) С точкой с запятой тоже не работает...

lemann 23.04.2024 12:09

На точки с запятой необходимо заменить только запятые. «Переменные» показывают, что представляет собой каждая переменная.

VBasic2008 23.04.2024 13:02

Здравствуйте, я обнаружил, что в моем Excel также есть проблемы с буквами c и r. Итак, я использовал это, но все равно безрезультатно: =LET(data;A1:H11;na;0; {1;3;5;7};SEQUENCE(COLUMNS(data)/2;;;2); A1: H1;TAKE(данные;1); J1:N1;HSTACK(TAKE(A1:H1;;1);ВЫБЕРИТЬ(A1:H1;{2;4;6;8})); A2:H11;DROP(данные) ;1); J2:J17;SORT(UNIQUE(TOCOL(ВЫБЕРИТЕ ЭКОЛОГИ(A2:H11;{1;3;5;7});1))); K2:N17;DROP(REDUCE("";{1; 3;5;7};LAMBDA(yy;u; HSTACK(yy;XLOOKUP(J2:J17;CHOOSECOLS(A2:H11;u); CHOOSECOLS(A2:H11;u+1);na))));; 1); ВСТАК (J1: N1; HSTACK (J2: J17; K2: N17)))

lemann 24.04.2024 09:17

Вот еще один способ использования MAKEARRAY() --> не использования тяжелых ресурсных функций для манипулирования данными.


• Формула, используемая в ячейке J1

=LET(
     _Data, A1:H35,
     _Header, TAKE(_Data,1),
     _Rest, DROP(_Data,1),
     _Uniq, UNIQUE(TOCOL(FILTER(_Rest,_Header=TAKE(_Header,,1)),1,1)),
     _Output, MAKEARRAY(ROWS(_Uniq),MAX(SEQUENCE(,COLUMNS(_Rest)/2)),LAMBDA(r,c,
     IFNA(VLOOKUP(INDEX(_Uniq,r,),CHOOSECOLS(_Rest,c*2-{1,0}),2,0),0))),
     VSTACK(UNIQUE(_Header,1), HSTACK(_Uniq,_Output)))

Я обнаружил, что в моем Excel есть проблемы с буквами r и c, поэтому я использовал это: =LET( _Data; A1:H35; _Header; TAKE(_Data;1); _Rest; DROP(_Data;1); _Uniq; UNIQUE( TOCOL(FILTER(_Rest;_Header=TAKE(_Header;;1));1;1)); _Output;ROWS(_Uniq);MAX(SEQUENCE(;COLUMNS(_Rest)/2));LAMBD‌​A( u;y; IFNA(VLOOKUP(INDEX(_Uniq;u;);CHOOSECOLS(_Rest;y*2-{1;0});2;0‌​);0))); VSTACK(UNIQUE(_Header;1) ; HSTACK(_Uniq;_Output))) Однако результата нет: функция FILTER возвращает ошибку.

lemann 24.04.2024 09:21

@lemann все данные решения работают с моей стороны, это из-за вашей версии Excel, которая не поддерживает.

Mayukh Bhattacharya 24.04.2024 09:49

Большое спасибо за Вашу помощь! Я постараюсь обновить свой Excel и попробовать ваши решения. Пожалуйста, сообщите мне, какую версию Excel вы использовали.

lemann 24.04.2024 09:59

@ Леманн MS365. Вы также можете использовать веб-версию Excel, а также нажмите здесь

Mayukh Bhattacharya 24.04.2024 10:01

Ради интереса моя рекурсивная альтернатива должна быть быстрой:

Формула в J1:

=LET(r,A1:H35,h,A1:H1,n,UNIQUE(TOCOL(IFERROR(IFS(h>"0",r&"")*1,"Mass"))),x,LAMBDA(f,i,z,IF(i=COLUMNS(r),z,f(f,i+2,HSTACK(z,VLOOKUP(n,DROP(r,,i),2,0))))),IFNA(x(x,,n),))

Спасибо за помощь, но результата нет: выдает ошибку "недопустимое имя". Я использовал это: =LET(y;A1:H35;h;A1:H1;n;UNIQUE(TOCOL(IFERROR(IFS(h>"0";y&"")‌​*1;"Mass")) );x;LAMBD‌​A(f;i;u;IF(i=COLUMNS‌​(y);u;f(f;i+2;HSTACK‌​(u;VLOOKUP(n;DROP(y;‌​; i);2;0)))));IFNA(x(‌​x;;n);))

lemann 24.04.2024 09:23

Он отлично работает для меня. Я использую тот же синтаксис и с точкой с запятой. @lemann. Какую версию Excel вы используете?

JvdV 24.04.2024 09:26

Microsoft Excel 2019 MSO (16.0.10406.20006) 32-разрядная версия

lemann 24.04.2024 09:43

@lemann все данные решения работают с моей стороны, это из-за вашей версии Excel, которая не поддерживает.

Mayukh Bhattacharya 24.04.2024 09:49

Другие вопросы по теме