使用.I返回包含data.table包的行号

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)

我想返回行索引的向量,其中条件iTRUE,例如哪些行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返回的行号xi相匹配.如果NA,则返回i没有匹配的行号x.默认情况下FALSE,x返回该匹配项中的行.


说明:

请注意, Namely中.Ii = ..参数与参数之间存在特定关系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)

看看整个表的子集和子集之间的区别 .I

DT[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)

  • 现在你可以做`DT [X> 10,= TRUE] (8认同)
  • `DT [X> 20,= TRUE]`......关于data.table还有哪些其他秘密?我想知道他们*全部*.data.table是我见过的最好的软件. (4认同)

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应该返回您的预期.我可以看到,使用.Ij连同两个iby可能是有用的.正如你所指出的那样,目前.I似乎没有任何帮助i.

使用该which()函数是好的,但可能会绕过优化i(which()需要一个必须创建并传递给它的长逻辑输入).使用which=TRUE参数是好的,但然后返回行号(你不能再用j组中的那些行号做一些事情).

功能请求#1494提交讨论.I按您期望的方式改变工作.该文档确实包含单词"它在x中的行位置",这意味着你所期望的x是整个data.table.


C8H*_*4O2 6

或者,

 DataTable[ , which(X>10) ]
Run Code Online (Sandbox Code Playgroud)

可能更容易理解,更具有惯用力R.