生成多列范围的所有唯一值的列表,并根据它们在最后X列中出现的次数给出值评级

时间:2016-07-25 09:19:40

标签: google-sheets

正如标题所说。

我有这样的范围:

  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表格命令完成,还是必须使用脚本?

2 个答案:

答案 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;
}

测试它:

  1. 转到脚本编辑器:工具→编辑器(或在Chrome浏览器中:[Alt→T→E])
  2. 将此代码粘贴到脚本编辑器后,将其用作简单的公式:=normalizeData(data!A2:C4)
  3. 您将获得结果表:

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

    并获得所需的输出。