我偶然发现了奇怪的数据表i
行为,它返回了一行NA
s,我希望这里有一个空数据表。见:
a = data.table(a = 1, d = NA)
a[!is.na(a) & d == "3"]
# a d
# 1: NA NA
我希望这里有一个空数据表。 比较:
a = data.table(a = c(1,2), d = c(NA,3))
a[!is.na(a) & d == "3"]
# a d
# 1: 2 3
虽然这个值不会产生额外的行NA
这是data.table
中的一个错误,还是某个人可以解释这种行为的逻辑?
答案 0 :(得分:1)
不知道它是否是一个错误,但它似乎与你的变量d的类型有关。
a = data.table(a = 1, d = NA)
str(a)
# Classes ‘data.table’ and 'data.frame': 1 obs. of 2 variables:
# $ a: num 1
# $ d: logi NA
# - attr(*, ".internal.selfref")=<externalptr>
a[!is.na(a) & d == "3"] # this returns NAs
# a d
# 1: NA NA
a[!is.na(a) & !is.na(d)] # this returns nothing
# Empty data.table (0 rows) of 2 cols: a,d
这个也有效:
a = data.table(a = 1, d = 4)
str(a)
# Classes ‘data.table’ and 'data.frame': 1 obs. of 2 variables:
# $ a: num 1
# $ d: num 4
# - attr(*, ".internal.selfref")=<externalptr>
a[!is.na(a) & d == "3"]
# Empty data.table (0 rows) of 2 cols: a,d
如果变量属于逻辑类型,则无法将其与其他类型进行比较并返回NAs。 但是,使用dplyr包它似乎有效:
library(dplyr)
a = data.table(a = 1, d = NA)
a %>% filter(!is.na(a) & d == "3")
# Empty data.table (0 rows) of 2 cols: a,d
与子命令相同:
subset(a, !is.na(a) & d == "3")
# Empty data.table (0 rows) of 2 cols: a,d
答案 1 :(得分:1)
感谢ping @SergiiZaskaleta。我忘了更新这个问题,但这已经修复了一段时间,with this commit。
来自NEWS:
- 使用
醇>i
中的逻辑表达式的子集永远不会返回所有 -NA
行。边缘案例DT[NA]
现已修复,#1252。感谢@sergiizaskaleta。