library(data.table)
dt <- data.table(A=c(NA,3,5,0,1,2),B=c("foo","foo","foo","bar","bar","bar"))
dt
#> A B
#> 1: NA foo
#> 2: 3 foo
#> 3: 5 foo
#> 4: 0 bar
#> 5: 1 bar
#> 6: 2 bar
#simple filter
dt[,.I[A>1]]
#> [1] NA 2 3 6
dt[A>1,which=TRUE]
#> [1] 2 3 6
Run Code Online (Sandbox Code Playgroud)
I was expecting those two should return the same result.
前一种情况使用baseR 逻辑进行子集化;后一种情况使用data.table的子集逻辑略有不同。
data.tableNA从过滤中排除:
dt[A > 1]
# A B
# 1: 3 foo
# 2: 5 foo
# 3: 2 bar
# compare to base logic:
setDF(dt)
dt[dt$A > 1, ]
# A B
# NA NA <NA>
# 2 3 foo
# 3 5 foo
# 6 2 bar
setDT(dt)
Run Code Online (Sandbox Code Playgroud)
您可以通过在第一个语句中添加一些诊断来更多地了解这一点:
dt[, {
idx = A > 1
print(idx)
print(seq_len(.N)[idx])
.I[A>1]
}]
# [1] NA TRUE TRUE FALSE FALSE TRUE
# [1] NA 2 3 6
# [1] NA 2 3 6
Run Code Online (Sandbox Code Playgroud)
该base逻辑是,NA意思是“未知”,所以是否保留或删除元素NA索引也是未知的,因此输出必须是NA。来自?"[":
索引中的 NA
提取时,数字、逻辑或字符
NA索引选择未知元素,因此返回NA逻辑、整数、数字、复数或字符结果的相应元素,并返回NULL列表。(它返回00原始结果。)
与来自?data.table:
i整数和逻辑向量的工作方式与它们相同,
[.data.frame只是逻辑NAs 被视为FALSE。