如何在 data.table 中按多列分组?

3
我正在尝试在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]

这可能是一个非常简单的问题,但我无法找到答案。

谢谢您的帮助!


@Matthew Dowle 感谢您的编辑,您是正确的。通常我会这样做,但由于某种原因忘记了。 - Jochem
1个回答

5
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。


@MatthewDowle,如果有未被索引(键)覆盖的“by”表达式,性能如何?我正在考虑在具有5+M行和数千个不同组值的表中使用它来按列表列表达式分组。 - Sim
@Sim 最好尝试并为您的数据集计时。尽可能使用整数类型。标签中有一个基准测试,可以比较未排序和已排序的时间,并且它指出了一个重要的问题。 - Matt Dowle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接