REDUCE с условным VSTACK внутри LAMBDA. Является ли это возможным?

Я пытаюсь построить VSTACK из динамического диапазона, используя REDUCE.

Что я получаю:

Что я хочу (обратите внимание, что значение XX игнорируется)

По сути, вопрос в том, как использовать условный HSTACK внутри LAMBDA внутри REDUCE. Здесь я хочу игнорировать ячейки со значением «XX» и создать динамическое разлив по HSTACK.

Я знаю, что мог бы просто использовать FILTER, но это всего лишь простой пример, где мне часто хочется выполнить более сложные условные изменения внутри сокращения в зависимости от значения ячейки, а затем HSTACK результатов (или игнорировать).

Я не понимаю, чем обусловлены значения #N/A.

HSTACK работает без условия, т.е. это работает (добавьте "%" и HSTACK):

У вас поменялись аргументы в IF — это должно быть: =REDUCE("",A1:A6,LAMBDA(init,cell,IF(cell = "XX",init,HSTACK(i‌​nit,cell)))), и вам нужно обернуть это в DROP, чтобы избавиться от первого пробела. Для дальнейшего использования размещение формулы в виде изображения на самом деле не поможет нам помочь вам. ;)

Rory 05.09.2024 08:50

Спасибо, Рори. Хороший пикап, думаю, в этом вся суть.

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

Ответы 3

Используйте FILTER() и TOROW(). Пытаться-

=TOROW(FILTER(A1:A100,(A1:A100<>"XX")*(A1:A100<>""))&"%")

Для работы с REDUCE() вам понадобится функция IF(). =REDUCE("",A1:A6,LAMBDA(init,cll,HSTACK(init,IF(cll = "XX","",‌​cll&"%")))).

Harun24hr 05.09.2024 08:28

С REDUCE он помещает пустую ячейку между D и E, в то время как желаемый результат OP (второе изображение) не имеет ни одного, поэтому его все равно необходимо отфильтровать.

user11222393 05.09.2024 08:40

@user11222393 user11222393 Вы правы. Просто нужно отфильтровать или игнорировать пустые результаты.

Harun24hr 05.09.2024 08:49

У меня не получилось с ним работать REDUCE; но вместо этого я использовал MAP с FILTER, возможно, этого будет достаточно для ваших будущих проектов:

=FILTER(MAP(A1:A7;LAMBDA(a;IF(a = "xx";"";a)));A1:A7<>"xx")

Разве это не выполнение одной и той же работы дважды? Почему бы просто не =FILTER(A1:A7,A1:A7<>"XX")

Rory 05.09.2024 10:01

@Рори, в принципе да, но ОП хотел чего-то другого, а не просто ФИЛЬТР, я не уверен, каковы их намерения в будущем.

Excellor 05.09.2024 10:08

Достаточно справедливо, но я бы сказал, что было бы более привычно использовать в качестве критериев MAP.

Rory 05.09.2024 10:18
Ответ принят как подходящий

Практика с функцией REDUCE

  • Думаю, Рори все сказал в твоих комментариях.
  • Мне нравится помещать входные данные в первую строку, чтобы формула была «готова к LAMBDA» (готова к преобразованию в функцию LAMBDA в диспетчере имен).
  • При использовании REDUCE вы часто будете использовать "" в качестве первого аргумента, а в простых требованиях, подобных вашему, столбец (или строку) в качестве второго аргумента. "" даст фиктивный первый результат и его следует удалить с помощью DROP.
  • Внутри LAMBDA я использую rr и r для столбца, поскольку я просматриваю строки (или cc и c для строки, поскольку я просматриваю столбцы).
  • Важно понимать, что rr представляет текущий сложенный результат, а r представляет значение в текущей строке.
  • Если вы не хотите суммировать, сохраните результат (rr) как есть (перепишите rr) — в противном случае складывайте rr и r по мере необходимости.
=LET(data,A1:A6,exclude,"XX",suffix,"%",
    DROP(REDUCE("",data,LAMBDA(rr,r,
        IF(r=exclude,rr,HSTACK(rr,r&suffix)))),,1))

LAMBDA-готовность

  • В данном конкретном случае я заменю LET на LAMBDA и удалю все аргументы в первой строке:

    =LAMBDA(data,exclude,suffix,
         DROP(REDUCE("",data,LAMBDA(rr,r,
             IF(r=exclude,rr,HSTACK(rr,r&suffix)))),,1))
    
  • Затем я воспользуюсь этой формулой в диспетчере имен и создам имя, например. StackColumnH чтобы иметь возможность использовать эту функцию LAMBDA в любом месте книги:

    =StackColumnH(A1:A6,"XX","&")
    

Более эффективные способы удовлетворения требований (вряд ли актуально)

MS365

=LET(data,A1:A6,exclude,"XX",suffix,"%",
    TOROW(IFS(data<>exclude,data&suffix),2))

Эксель 2021

=LET(data,A1:A6,exclude,"XX",suffix,"%",
    TRANSPOSE(FILTER(data&suffix,data<>exclude)))

Мне нравятся фрагменты «Едва ли релевантные». +1

JimminyJim 05.09.2024 15:23

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