【问题标题】:Strange behavior for filtering in data.table在 data.table 中过滤的奇怪行为
【发布时间】:2015-08-07 08:52:30
【问题描述】:

我偶然发现了奇怪的数据表 i 行为,它返回一行带有 NAs 的行,我希望这是一个空数据表。见:

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 中的错误还是有人可以解释这种行为背后的一些逻辑?

【问题讨论】:

  • 我在 R 2.15.2 和 data.table 1.9.4,如果这很重要的话
  • 这是一个错误。请在 github 项目页面上提出问题。谢谢。
  • Reported。这个问题应该怎么做?
  • 最好保留它,以便我们可以在修复后回答它,这将阻止未来的 Q(如果被问到很容易标记为 dup)。
  • @Arun,看起来它已在 1.9.8 中修复。您能否提供一个答案并确认这不再可重现,以便我接受?

标签: r data.table


【解决方案1】:

感谢 ping @SergiiZaskaleta。我忘了更新这个问题,不过这个问题已经在不久前修复了,with this commit

来自NEWS

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

【讨论】:

    【解决方案2】:

    不知道是不是bug,但好像和你的变量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
    

    看起来如果一个变量是逻辑类型,它就不能与另一种类型进行比较并返回 NA。 但是,使用 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
    

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多