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.
前一种情况使用base
R 逻辑进行子集化;后一种情况使用data.table
的子集逻辑略有不同。
data.table
NA
从过滤中排除:
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
只是逻辑NA
s 被视为FALSE
。