【发布时间】:2022-01-03 21:13:36
【问题描述】:
我很难理解.I 在data.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>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>3]] 给出了x>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>3,.I,by = x]$I中的行位置来自dt[x>3],所以第一组应该从 1 开始? -
@denis,您实际上是在最后一个问题中自己回答的;)首先是 .GRP 应该从 1 开始(确实如此),而 .I 将从 4 开始,因为它应该是做。比较
dt[x > 3, .I, by = x]与dt[x > 3, .GRP, by = x]
标签: r data.table