在data.table中过滤的奇怪行为

时间:2015-08-07 08:52:30

标签: r data.table

我偶然发现了奇怪的数据表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中的一个错误,还是某个人可以解释这种行为的逻辑?

2 个答案:

答案 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

  
      
  1. 使用i中的逻辑表达式的子集永远不会返回所有 - NA行。边缘案例DT[NA]现已修复,#1252。感谢@sergiizaskaleta。
  2.