首页 文章

data.table中的.EACHI?

提问于
浏览
54

我似乎无法找到关于 .EACHIdata.table 中究竟是什么的任何文档 . 我在文档中看到它的简要提及:

在i中传递这些组并通过= .EACHI设置时,已知组子集的聚合特别有效 . 当i是data.table时,DT [i,j,by = .EACHI]评估i中每行连接的DT组的j . 我们称之为每个i的分组 .

DTDT 的上下文中是什么意思?是否由 DT 上设置的键确定的组?该组是否每个使用所有列作为键的不同行?我完全理解如何运行像 DT[i,j,by=my_grouping_variable] 这样的东西但是对于 .EACHI 如何工作感到困惑 . 有人可以解释一下吗?

1 回答

  • 95

    我已将此添加到列表here . 希望我们能够按计划交付 .


    原因很可能是 by=.EACHI 是最近的一个特征(从1.9.4开始),但它的作用并非如此 . 让我举个例子来解释一下 . 假设我们有两个data.tables XY

    X = data.table(x = c(1,1,1,2,2,5,6), y = 1:7, key = "x")
    Y = data.table(x = c(2,6), z = letters[2:1], key = "x")
    

    我们知道我们可以通过 X[Y] 加入 . 这类似于子集操作,但使用 data.tables (而不是整数/行名或逻辑值) . 对于 Y 中的每一行,取 Y 的键列,它会在 X 的键列( Y 中的列)中找到并返回相应的匹配行 .

    X[Y]
    #    x y z
    # 1: 2 4 b
    # 2: 2 5 b
    # 3: 6 7 a
    

    现在让's say we' d喜欢,对于 Y 's key columns (here only one key column), we'中的每一行,我想得到 X 中的匹配计数 . 在 data.table < 1.9.4 的版本中,我们可以通过在 j 中指定 .N 来执行此操作,如下所示:

    # < 1.9.4
    X[Y, .N]
    #    x N
    # 1: 2 2
    # 2: 6 1
    

    这隐含地做的是,在 j 存在的情况下,在 X 的每个匹配结果上评估 j-expression (对应于 Y 中的行) . 这被称为by-without-by或implicit-by,因为它隐藏着_1562461 .

    问题是这将始终执行 by 操作 . 所以,如果我们想知道连接后的行数,那么我们必须这样做: X[Y][ .N] (在这种情况下只是 nrow(X[Y]) ) . 也就是说,如果我们不想要 by-without-by ,我们就不能在同一个调用中使用 j 表达式 . 因此,当我们执行例如 X[Y, list(z)] 时,它使用 by-without-by 评估了 list(z) ,因此稍慢 .

    此外 data.table 用户要求明确这一点 - 有关更多上下文,请参阅thisthis .

    因此添加了 by=.EACHI . 现在,当我们这样做时:

    X[Y, .N]
    # [1] 3
    

    它做了它的意图(避免混淆) . 它返回连接产生的行数 .

    和,

    X[Y, .N, by=.EACHI]
    

    Y 中对每一行的匹配行计算 j -expression(对应于来自 Y 's key columns here). It'的值,通过使用 which=TRUE 更容易看到这一点 .

    X[.(2), which=TRUE] # [1] 4 5
    X[.(6), which=TRUE] # [1] 7
    

    如果我们为每个运行 .N ,那么我们应该得到2,1 .

    X[Y, .N, by=.EACHI]
    #    x N
    # 1: 2 2
    # 2: 6 1
    

    所以我们现在有两个功能 . 希望这可以帮助 .

相关问题