从矩阵中删除 0

问题描述 投票:0回答:1

嗨我有以下数据

十二月 一月 二月 三月 四月
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

此数据当前保存在动态生成的范围内,有 2414 行和 27 列。每个值代表在给定月份收到追溯付款的案件编号的横截面,案件编号 122207 在 12 月收到追溯付款,案件编号 116282 和 122207 均在 2 月收到追溯付款。

我通过以下公式生成范围:

=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 个月的复古单位跟踪。

基本上发生的情况是,如果复古表的复古单位列中有一个非零数字,并且表中的特定月份列中有一个非零数字,那么它被认为是老化案例,我想这样记录它。然后乘以实际数字,就得到实际案例编号。

但我想要的是一个只有非零数字的数组。我尝试添加过滤条件,例如:

=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))))

但是由于每月需要数据,因此该公式不起作用,因为它会丢失列/行完整性。它将所有内容变成一列,我需要将每个月分开但又相互联系。

我想要的是删除所有 0,将每个月列折叠为仅其值,并根据原始报告中显示的非零数字数量为每个月设置一个可变列表长度。

excel-formula excel-365
1个回答
0
投票

这是你想要得到的吗?如果您需要步骤说明,请告诉我。

=VSTACK(
    RetroTable[#Headers],
    DROP(
        REDUCE(
            "",
            SEQUENCE(COLUMNS(RetroTable)),
            LAMBDA(acc, cur,
                LET(
                    col_, INDEX(RetroTable, 0, cur),
                    HSTACK(
                        acc,
                        ARRAYTOTEXT(
                            TOCOL(IF(col_, col_, NA()), 3)
                        )
                    )
                )
            )
        ),
        ,
        1
    )
)

Formula and result

© www.soinside.com 2019 - 2024. All rights reserved.