Удалить 0 из матрицы

Привет, у меня есть следующие данные

Декабрь январь февраль Маршировать апрель 0 0 0 0 116282 0 0 116282 116282 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 122207 0 0 0 0 0 122207 122207 0 0

И хотите получить следующий результат

Месяцы Цифры старения Декабрь 122207 январь 122207 февраль 116282, 122207 Маршировать 116282 апрель 116282

Эти данные в настоящее время хранятся в динамически генерируемом диапазоне и имеют 2414 строк и 27 столбцов. Каждое значение представляет собой срез номеров дел, которые получают ретро-платежи в данном месяце. Дело номер 122207 получает ретро-платеж в декабре, дела номер 116282 и 122207 получают ретро-платеж в феврале.

Я генерирую диапазон по следующей формуле:

=LET(a, RetroTable[Case Number],
     b, RetroTable[Retro Units], 
     c, CHOOSECOLS(RetroTable, XMATCH(Analysis!A2#, RetroTable[#Headers])), 
     a*ABS(b*c))

При этом A2# представляет собой массив месяцев 27x1 (2 года и 3 месяца отслеживания ретро-единиц).

По сути, происходит следующее: если в столбце ретро-единиц ретро-таблицы есть число, отличное от 0, и ненулевое число в конкретном столбце месяца в таблице, то это считается случаем старения, и я хочу задокументировать его как таковое. . Затем умножив его на фактическое число, я получу фактический номер дела.

Но мне нужен массив, содержащий только ненулевые числа. Я попытался добавить условие фильтра, например:

=LET(a, RetroTable[Case Number],
     b, RetroTable[Retro Units], 
     c, CHOOSECOLS(RetroTable, XMATCH(Analysis!A2#, RetroTable[#Headers])), 
     filter(a*ABS(b*c), a*ABS(b*c)<>0))

Но это приводит к ошибке #VALUE.

Я попробовал небольшую формулу

=LET(a, RetroTable[Case Number],
     b, RetroTable[Retro Units], 
     c, CHOOSECOLS(RetroTable, XMATCH(Analysis!A2#, RetroTable[#Headers])), 
     SMALL(IF(a*ABS(b*c)=0, "", a*ABS(b*c)), SEQUENCE(ROWS(RetroTable))))

Но поскольку данные необходимы ежемесячно, эта формула не работает, поскольку теряет целостность столбца/строки. Это превращает все в один столбец, и мне нужно, чтобы каждый месяц был разделен, но связан.

Я хочу удалить все нули, свернуть каждый ежемесячный столбец только в его значения и иметь переменную длину списка для каждого месяца в зависимости от того, сколько ненулевых чисел отображается в исходном отчете.

Эй, а результат XMATCH(Anaанализ!A2#, RetroTable[#Headers]) представляет собой непрерывный блок?

nkalvi 08.07.2024 18:02

да @nkalvi, это смежный квартал

bdpolinsky 08.07.2024 18:56

Пожалуйста, опубликуйте ожидаемый результат в ОП, отредактировав то же самое, чтобы другие пользователи могли визуализировать то, что вам нужно.

Mayukh Bhattacharya 08.07.2024 19:12
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
3
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обновлено 8 июля 2024 г.

=LET(
    comment_1, "Set this to = a*ABS(b*c)",
    case_unit_month, A1:E14,
    header, TAKE(case_unit_month, 1),
    numbers, DROP(case_unit_month, 1),
    aging_case_numbers, BYCOL(
        numbers,
        LAMBDA(col, ARRAYTOTEXT(TOCOL(IF(col, col, NA()), 3)))
    ),
    TRANSPOSE(VSTACK(header, aging_case_numbers))
)

привет @nkalvi! Для февраля значение должно быть 116282 и 122207, так как появляются оба числа.

bdpolinsky 08.07.2024 17:23

Извините, забыл завернуть колонку :)

nkalvi 08.07.2024 17:33

позволь мне попробовать кое-что

bdpolinsky 08.07.2024 17:49

О да. Позвольте мне подключить его :)

nkalvi 08.07.2024 17:52

ОК, проблема — ретро-таблица, это исходные данные, имеет 49 столбцов, в которых содержится много другой информации о случаях. Я показал вам диапазон анализа, который получает информацию, строго относящуюся к количеству случаев старения. Формулы, которые я вставил, я поместил их в диапазон и попытался заменить ссылки на таблицы именованным диапазоном, но продолжаю получать ошибки #value. Проблема проявляется во внутренней индексной функции, поскольку она пытается сослаться на именованный диапазон, который я заменил.

bdpolinsky 08.07.2024 17:58

Кроме того, я видел ошибки #value из-за CHOOSECOLS. В любом случае, через пару часов я еще раз посмотрю.

nkalvi 08.07.2024 18:11

Пожалуйста, взгляните на обновление, когда у вас будет возможность. Хотелось бы знать, понял ли я проблему :)

nkalvi 09.07.2024 00:39

да, ты понял.

bdpolinsky 09.07.2024 19:55
Ответ принят как подходящий

Попробуйте что-нибудь в этом роде, используя MAKEARRAY() :


=LET(
     _Body, RetroTable,
     _Rows, MAX(MMULT(SEQUENCE(,ROWS(_Body))^0,N(_Body>0))),
     _Output, IFERROR(MAKEARRAY(_Rows,COLUMNS(_Body),
     LAMBDA(r,c, INDEX(FILTER(INDEX(_Body,,c),INDEX(_Body,,c),""),r))),""),
     VSTACK(RetroTable[#Headers],_Output))

Обновленная формула в соответствии с ожидаемым выходным изменением OP:


=TRANSPOSE(VSTACK(RetroTable[#Headers],
 BYCOL(RetroTable,LAMBDA(α,TEXTJOIN(",",1,IF(α,α,""))))))

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