如果单元格值包含列名,则 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 行中的值的平均值的主要内容,如果未能解决你的问题,请参考以下文章