如果单元格值包含列名,则 Excel 行中的值的平均值

Posted

技术标签:

【中文标题】如果单元格值包含列名,则 Excel 行中的值的平均值【英文标题】:Excel average of values in row if cell value contains column names 【发布时间】:2021-12-15 10:58:26 【问题描述】:

我有一张桌子:

       A              B               C        D        E
       Identifier     Reference       DK       NO       SE
1      DK-NO          5               20       30       40
2      DK-SE          15              20       30       40
3      DK-NO-SE       20              20       30       40

现在,我要做的是计算“标识符”列中标识的值与“参考”中的值之间的平均差异,即第一个值是:AVERAGE(C1-B1;D1-B1 ) = AVERAGE(15;25) = 20,第二行是 AVERAGE(C2-B2;E2-B2) = AVERAGE(5,15) = 10 第三个 AVERAGE(C3-B3;D3-B3;E3-B3;) = AVERAGE(0;10;20) = 10,以此类推。

最好是能用在电源查询中的解决方案。

【问题讨论】:

另一方面,您只需要平均所需的 DK、NO 等值,然后减去结果的参考。 您的 Excel 版本有 LET() 电子表格功能吗? @DS_London 是的,是的 【参考方案1】:

这是使用 Power Query 的方法。

您使用 List.Accumulate 收集相关值;然后平均它们并减去参考。

请阅读代码 cmets 并按照应用步骤操作

let
    Source = Excel.CurrentWorkbook()[Name="Table4"][Content],

//set the data types
    colTypes = List.Zip(Table.ColumnNames(Source), Text.Type & List.Repeat(Int64.Type,Table.ColumnCount(Source)-1)),
    #"Changed Type" = Table.TransformColumnTypes(Source, colTypes),

//add Index column to identify the relevant (row)
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type),

//calculate the averages using List.Accumulate to gather the factors
    #"Added Custom" = Table.AddColumn(#"Added Index", "Average Diffs", each let 
            cols = Text.Split([Identifier],"-"),
            vals = List.Accumulate(cols,
                ,
                (state,current)=> state &  Record.Field(#"Added Index"[Index],current))
        in 
            List.Average(vals) - [Reference]),

//Delete the Index Column
    result = Table.RemoveColumns(#"Added Custom","Index")
in
    result

如果您有带有XMATCH 的 Windows Excel,您也可以在添加到同一个表的列中使用此公式:(请注意,您确实需要在公式的某些部分引用表名)

=AVERAGE(INDEX(Table47[@],, XMATCH(FILTERXML("<t><s>" & SUBSTITUTE([@Identifier],"-","</s><s>") & "</s></t>","//s"),Table47[#Headers])))-[@Reference]

【讨论】:

【参考方案2】:

你可以使用这个公式 =平均(间接(地址(行(B3),匹配(左(B3,2),$ 2:$ 2,0)))-C3,间接(地址(行(B3),匹配(右(B3,2), $2:$2,0)))-C3)

【讨论】:

需要澄清。当我更改“标识符”中的列数时,我似乎无法正常工作 - 你能帮我解决这个问题吗?我已更新问题以指定 =IF(LEN(B3)>5,AVERAGE(INDIRECT(ADDRESS(ROW(B3),MATCH(LEFT(B3,2),2:2,0)))-C3,INDIRECT (地址(行(B3),匹配(右(B3,2),2:2,0)))-C3,间接(地址(行(B3),匹配(中(B3,4,2),2): 2,0)))-C3),平均(间接(地址(行(B3),匹配(左(B3,2),2:2,0)))-C3,间接(地址(行(B3), MATCH(RIGHT(B3,2),2:2,0)))-C3)) 如果标识符采用 XX-XX 或 XX-XX-XX 等格式,您可以使用它【参考方案3】:

您拥有 PowerQuery 解决方案 (@Ron Rosenfeld)。

对于电子表格公式,您可以使用 LET() 创建 1 和 0 的掩码,并使用它来过滤列并创建平均值

例如对于单元格 F2,这个公式:

=LET(mask,IF(ISERROR(FIND(C$1:E$1,$A2)),0,1),(SUMPRODUCT(mask,C2:E2)/SUM(mask))-$B2)

应该允许您添加额外的列和新的 2 字符代码。

【讨论】:

以上是关于如果单元格值包含列名,则 Excel 行中的值的平均值的主要内容,如果未能解决你的问题,请参考以下文章

Excel:如果在另一列中发现重复的单元格值,则突出显示绿色

根据每个表格行中的单元格值更改按钮文本 - Jquery

(Excel) 基于相邻单元格值的条件格式

使用VB自动更新Excel中的单元格值

Excel VBA:用相邻的单元格值填充空单元格

datagridview获取某个单元格的值