【问题标题】:Create new column in data.table by group按组在 data.table 中创建新列
【发布时间】:2012-09-27 12:02:23
【问题描述】:

我没有使用 data.table 的经验,所以我不知道我的问题是否有解决方案(至少在 Google 上 30 分钟没有给出答案),但是就这样吧。

使用 data.frame 我经常使用以下命令来检查唯一值的观察次数:

df$Obs=with(df, ave(v1, ID-Date, FUN=function(x) length(unique(x))))  

在使用data.table的时候有没有对应的方法?

【问题讨论】:

  • data.tables 肯定有特定的方法。请参阅 vignettesfaqs 以获得该软件包!

标签: r vector data.table


【解决方案1】:

是的,有。令人高兴的是,您询问了在 v1.8.2 中添加的 data.table 的最新功能之一:

:= 按组现在已实现 (FR#1491) 并子分配给新列 现在通过引用自动添加列(使用NA 初始化,其中 子分配不接触)(FR#1997)。 := by group 可以与所有组合 i 的类型,因此 := by group 包括按 iby 分组。 由于:= by group 是通过引用,它应该比任何一个都快得多 (直接或间接)cbinds 将分组结果发送到 DT 的方法,因为 根本没有制作(大)DT 的副本。这是一种简短而自然的语法, 可以与其他查询复合。
DT[,newcol:=sum(colB),by=colA]

在你的例子中,iiuc,它应该是这样的:

DT[, Obs:=.N, by=ID-Date]

而不是:

df$Obs=with(df, ave(v1, ID-Date, FUN=function(x) length(unique(x))))

请注意,:= by group 可以很好地适用于大型数据集(较小的数据集将有很多小组)。

?":="Search data.table tag for "reference"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多