dt[.I,] 中 .I 的意外行为

Unexpected behavior of .I in dt[.I,]

根据 data.table 的帮助,我认为 .I 或多或少等同于 seq_len(nrow(dt))。但是当放在 data.table 的 [i, 上下文中时,它似乎无法正常工作。在下面的示例中,我试图标记(修改列的值)第 10 行之后的所有行:

data(iris)
setDT(iris)
iris[               .I   > 10L, newCol:='10+!'] # doesn't work
iris[seq_len(nrow(iris)) > 10L, newCol:='10+!'] # this works

为什么 .I 在这里不起作用?

来自文档:

.SD, .BY, .N, .I, .GRP, and .NGRP are read-only symbols for use in j. .N can be used in i as well. .I can be used in by as well. See the vignettes, Details and Examples here and in data.table. .EACHI is a symbol passed to by; i.e. by=.EACHI.

您可以通过链接实现所需的行为

data(iris)
setDT(iris)
iris[, .i := .I][.i> 10L, newCol:='10+!'][,.i := NULL]

请注意不要在 data.table 中命名变量 .I,否则尝试删除它会导致错误,因此,iris[, .I := .I][, .I := NULL] 将不起作用。

Ben373 从文档中提供了一个很好的片段,以及一个可行的解决方案。此外,在这种情况下,还可以这样做:

iris[, newCol:=fifelse(.I>10, '10+!', as.character(NA))]