2012-11-25 62 views
2

我想在data.table中做一些聚合,我面臨着一個無法找到解決方案的挑戰。挑戰非常簡單,我想在多個維度中總結data.table中的一些值。如何通過data.table中的多個列進行分組?

我沒有問題得到下面的代碼工作:

Export4R[,sum(units),by=Type] 

這給了大意如下的內容:

Type Value 
foobar 45 
barfoo 25 

但現在我想進一步打破它一點降一點並希望得到這樣一個表格:

Type Month Value 
foobar Mar  12 
foobar Apr  7 
.... 

我試圖做到這一點與一行鱈魚Ë像,但不幸的是這似乎不工作:

Export4R[,sum(units),by=Type,Month] 

這很可能是一個非常簡單的問題,但我找到了答案的問題。

感謝您的協助!

+0

@Matthew Dowle感謝您的編輯,你是對的。通常做它,但由於某種原因忘記它。 – Jochem

回答

3
Export4R[,sum(units),by="Type,Month"] 

Export4R[,sum(units),by=list(Type,Month)] 



後者語法允許列名和命名的表達式;例如,

Export4R[,sum(units),by=list(Grp1=substring(Type,1,2), Grp2=Month)] 

順便說一句,你可以格式化長的查詢在許多行:

Export4R[,list(
    s = sum(units) 
    ,m = mean(units) 
),by=list(
    Grp1=substring(Type,1,2) 
    ,Grp2=Month 
)] 

之所以把逗號在這樣的開始是讓你可以輕鬆地添加和註釋掉列,而不會與最後一項的右括號雜亂無章;例如,

Export4R[,list(
    s = sum(units) 
    # ,m = mean(units) 
),by=list(
    Grp1=substring(Type,1,2) 
    # ,Grp2=Month 
)] 

該想法來自SQL。

+0

很好的答案!謝謝! – Jochem

+0

@MatthewDowle當沒有索引(鍵)覆蓋的'by'表達式時,性能如何?我正在考慮用這種方法按列表列表的形式進行分組,列表中有5 + M行和數千個不同的組值。 – Sim

+0

@Sim最好只是試試它和時間爲你的數據集。儘量保持整數類型。在標籤的某個地方有一個基準,這個基準的時間是不加鍵的,而這個基準的差別在於它的作用。 –

相關問題