use*_*605 42 r data.table
有人请向我解释一下.I返回data.table的行号的正确用法吗?
我有这样的数据:
require(data.table)
DT <- data.table(X=c(5, 15, 20, 25, 30))
DT
# X
# 1: 5
# 2: 15
# 3: 20
# 4: 25
# 5: 30
Run Code Online (Sandbox Code Playgroud)
我想返回行索引的向量,其中条件i是TRUE,例如哪些行X大于20.
DT[X > 20]
# rows 4 & 5 are greater than 20
Run Code Online (Sandbox Code Playgroud)
为了得到指数,我试过:
DT[X > 20, .I]
# [1] 1 2
Run Code Online (Sandbox Code Playgroud)
...但显然我做错了,因为它只返回一个包含返回行数的向量.(我认为这几乎.N是为了什么?).
很抱歉,如果这似乎是非常基本的,但所有的我已经能够在data.table文档中找到是什么.I和.N做什么,而不是如何使用它们.
Ric*_*rta 63
如果您想要的只是行号而不是行本身,那么请使用which = TRUE,而不是 .I.
DT[X > 20, which = TRUE]
# [1] 4 5
Run Code Online (Sandbox Code Playgroud)
这样您就可以获得优化的好处i,例如快速连接或使用自动索引.这which = TRUE使得它只用行号返回.
这是whichdata.table中参数的手动输入:
TRUE返回的行号x是i相匹配.如果NA,则返回i没有匹配的行号x.默认情况下FALSE,x返回该匹配项中的行.
请注意,
Namely中.I的i = ..参数与参数之间存在特定关系DT[i = .., j = .., by = ..],.I是子集化表的行号向量.
### Lets create some sample data
set.seed(1)
LL <- sample(LETTERS[1:5], 20, TRUE)
DT <- data.table(X=LL)
Run Code Online (Sandbox Code Playgroud)
.IDT[X == "B", .I]
# [1] 1 2 3 4 5 6
DT[ , .I[X == "B"] ]
# [1] 1 2 5 11 14 19
Run Code Online (Sandbox Code Playgroud)
Mat*_*wle 13
很抱歉,如果这看起来非常基本,但我能在data.table文档中找到的是什么.I和.N做,不是如何使用它们.
首先让我们检查一下文档.我输入?data.table并搜索了.I.这是什么:
高级:分组时,符号.SD,.BY,.N,.I和.GRP可用于j表达式,定义如下.
.I是一个等于seq_len(nrow(x))的整数向量.在分组时,它为组中的每个项目保留其在x中的行位置.这对于j中的子集很有用; 例如DT [,.I [which.max(somecol)],by = grp].
我在这里强调了重点.最初的目的是.I在分组时使用.请注意,实际上在如何使用的文档中有一个示例.I.
你不是分组.
那就是说,你尝试的是合理的.随着时间的推移,这些符号在不进行分组时也会被使用.可能有一个案例.I应该返回您的预期.我可以看到,使用.I中j连同两个i和by可能是有用的.正如你所指出的那样,目前.I似乎没有任何帮助i.
使用该which()函数是好的,但可能会绕过优化i(which()需要一个必须创建并传递给它的长逻辑输入).使用which=TRUE参数是好的,但然后只返回行号(你不能再用j组中的那些行号做一些事情).
功能请求#1494提交讨论.I按您期望的方式改变工作.该文档确实包含单词"它在x中的行位置",这意味着你所期望的x是整个data.table.