【问题标题】:.I in R data.table: what is the rational for the different behaviorsR data.table中的.I:不同行为的合理性是什么
【发布时间】:2022-01-03 21:13:36
【问题描述】:

我很难理解.Idata.table 中的行为。 这是一个例子

library(data.table)
dt <- data.table(x = 1:50)

dt[x>3,.I]
dt[,.I[x>3]]
dt[x>3,.I,by = x]$I

我不明白最后一行行为的基本原理(尽管我觉得它很实用)。

dt[x&gt;3,.I] 给出子集 dt 的行。所以从 1 到 47。

dt[x>3,.I]

[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
[44] 44 45 46 47

dt[,.I[x&gt;3]] 给出了x&gt;3 所在的行,所以从 4 到 50:

dt[,.I[x>3]]

 [1]  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
[44] 47 48 49 50

但是为什么在子集数据集上使用分组操作仍然会给出子集条件为真的整个 dt 的行?

dt[x>3,.I,by = x]$I
 [1]  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
[44] 47 48 49 50

【问题讨论】:

  • 来自?.I".I 是一个等于seq_len(nrow(x)) 的整数向量。在分组时,它适用于组中的每个项目,其行位置在x 中。这对j 中的子集很有用;例如DT[, .I[which.max(somecol)], by=grp]。"
  • 所以我认为.I 的工作方式与文档中的完全一致。如果您的问题是“为什么作者要这样创建 .I?”,这似乎是一个基于意见的问题,对于 Stack Overflow 来说并不是真正的主题。
  • (有点)相关阅读:local and global versions of .I, .N
  • @GregorThomas 但是dt[x&gt;3,.I,by = x]$I 中的行位置来自dt[x&gt;3],所以第一组应该从 1 开始?
  • @denis,您实际上是在最后一个问题中自己回答的;)首先是 .GRP 应该从 1 开始(确实如此),而 .I 将从 4 开始,因为它应该是做。比较 dt[x &gt; 3, .I, by = x]dt[x &gt; 3, .GRP, by = x]

标签: r data.table


【解决方案1】:

我想我开始理解这种困惑了。

dt[x > 3, .I]

这里data.table首先是子集,然后根据子集返回一个带有行号的向量。

dt[, .I[x > 3]]

这里你没有对 dt 中的每一行进行子集化和分配一个行号,而是将它们返回为 x > 3

dt[x > 3, .I, by = x]$I

这里有一个棘手的问题,您认为您首先要进行子集化,但事实并非如此。请注意,不会返回向量,因为您在创建它之后添加 $I。您会看到这里的 data.table 通过引用仅将行号分配给每行 WHERE (i) x > 3,因为您按每行分组,然后按子集分组。似乎 by 改变了子集的顺序,实际上与 dt[, .I, by = x][x &gt; 3] 相同

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多