2016-07-25 16 views
1

正如標題所述。生成多列範圍的所有唯一值的列表,並根據它們在最後一個X列中出現的次數給這些值分級

我有一個範圍是這樣的:根據

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 Sheets命令完成,還是必須使用腳本?

回答

0

對不起,我的知識還不足以構建數組公式,但我可以解釋如何通過單元格獲取它,然後從中擴展範圍。

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包含計數。

0

我建議使用腳本和公式。


規範化數據

Script是標準化數據的最簡單方法。這將您的列轉換爲單列數據:

/** 
* 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)

你會得到結果表:

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,然後,返回一和零。

然後進行簡單的查詢公式:

=QUERY({A:D},"select Col3, sum(Col4) where Col1 > 0 group by Col3") 

,並得到所需的輸出。

+0

我試圖實現這一點。它似乎沒有做的一件事是評級。例如,如果我總共有兩欄,而A欄和B欄有鼠標,那麼鼠標的層應該是一個。但是如果我添加一個沒有老鼠的C列,老鼠的等級應該下降一次。因此,它似乎缺少一種方法來指定從最右邊的列中讀取多少列以確定一個層。 – edoreld

+0

如果您的意思是擴大範圍,那麼當添加新列時,請嘗試使用公式INDIRECT:'= normalizeData(indirect(「data!A2:」&ADDRESS(COUNTA(data!A:A),COUNTA(data!1:1)), 4)))' –

相關問題