2012-11-25 25 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最好只是试试它和时间为你的数据集。尽量保持整数类型。在标签的某个地方有一个基准,这个基准的时间是不加键的,而这个基准的差别在于它的作用。 –

相关问题