正如标题所说。
我有这样的范围:
A B C
------ ------ ------
duck fish dog
rat duck cat
dog bear bear
我想要的是获取范围内所有唯一值的单列列表,并根据它们在最后X列中出现的次数为其分配评级(或层级)(更多列是不断添加到右侧)。
例如,让我们说:
第0层:最后2列没有出现。
第1层:在最后2列中出现过一次
第2层:在最后2列中出现了两次。
所以结果应该是:
Name Tier
------ ------
duck 1
rat 0
dog 1
fish 1
bear 2
cat 1
我可以使用以下方法生成唯一值列表:
=ArrayFormula(UNIQUE(TRANSPOSE(SPLIT(CONCATENATE(B2:ZZ9&CHAR(9)),CHAR(9)))))
但这是我不确定如何实现的第二部分。这可以通过Google表格命令完成,还是必须使用脚本?
答案 0 :(得分:1)
很抱歉,我的知识不足以构建一个数组公式,但我可以解释我是如何获得每个单元格然后扩展它的范围。
第1部分:计算非空列的数量(假设如果列在第二行有某些内容,那么它就会被填充。
COUNTA( FILTER( Sheet1!$B$2:$Z$2 , NOT( ISBLANK( Sheet1!$B$2:$Z$2 ) ) ) )
第2部分:为最后两个填充列构建范围:
OFFSET(Sheet1!$A$2, 0, COUNTA( ... )-1, 99, 2)
第3部分:使用COUNTIF
来计算我们在那里遇到的“熊”的数量(这里我们可以传递一个单元格引用):
COUNTIF(OFFSET( ... ), "bear")
我构建了一个获取结果的示例电子表格,这里是link(我知道外部链接不好,但没有其他选择来显示可重现的示例)。
Sheet1包含数据,Sheet2包含计数。
答案 1 :(得分:0)
我建议使用脚本和公式。
规范化数据
脚本是规范化数据的最简单方法。它会将您的列转换为单列数据:
/**
* converts columns into one column.
*
* @param {data} input the range.
* @return Column number, Row number, Value.
* @customfunction
*/
function normalizeData(data) {
var normalData = [];
var line = [];
var dataLine = [];
// headers
dataLine.push('Row');
dataLine.push('Column');
dataLine.push('Data');
normalData.push(dataLine);
// write data
for (var i = 0; i < data.length; i++) {
line = data[i];
for (var j = 0; j < line.length; j++) {
dataLine = [];
dataLine.push(i + 1);
dataLine.push(j + 1);
dataLine.push(line[j]);
normalData.push(dataLine);
}
}
return normalData;
}
测试它:
=normalizeData(data!A2:C4)
您将获得结果表:
Row Column Data
1 1 duck
1 2 fish
1 3 dog
2 1 rat
2 2 duck
2 3 cat
3 1 dog
3 2 bear
3 3 bear
然后用它进行进一步的计算。有几种方法可以做到这一点。一种方法是使用带有标准的额外列,在D列粘贴此公式:
=ARRAYFORMULA((B2:B>1)*1)
它将检查列号是否大于1并返回1和0。
然后制作简单的查询公式:
=QUERY({A:D},"select Col3, sum(Col4) where Col1 > 0 group by Col3")
并获得所需的输出。