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))]
根据 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))]