【问题标题】:Issue with filtering data.table for dates - works with fixed date but not with variable过滤 data.table 的日期问题 - 适用于固定日期但不适用于变量
【发布时间】:2015-07-16 14:06:48
【问题描述】:

我想为日期过滤 data.table - 给定开始日期和结束日期,我想要包含给定日期的所有行。

现在我的问题:当我使用固定日期时它可以工作,但是当我想将日期存储在外部变量中时它会返回一个空表。有什么提示吗?

dt = data.table(begin=as.Date('2014-01-01'):as.Date('2014-01-10'),
                end=as.Date('2014-01-01'):as.Date('2014-01-10')+c(1,1,1,2:8),
                x=c('A','B','C','D','E','J','J','J','J','J'))
dt[,`:=`(begin_idate=as.IDate(begin, origin='1970-1-1'),
         end_idate=as.IDate(end, origin= '1970-1-1'))]
dt[as.Date('2014-01-09')>begin_idate  & as.Date('2014-01-09')<=end_idate ] # works
x=as.Date('2014-01-09')
dt[x>begin_idate  & x<=end_idate ] #doesnt' work - empty data.table

【问题讨论】:

    标签: r date data.table


    【解决方案1】:

    这是因为data.table 的其中一列名为x。当data.table 评估它的第一个参数(您正在使用的那个)时,它首先查找x 作为列引用。所以实际上x&gt;begin_idate被解释为

    dt$x > dt$begin_idate 
    

    这会引发错误。

    要解决此问题,请使用还不是列名dt 的名称。例如

    xx = as.Date('2014-01-09')
    dt[xx>begin_idate  & xx<=end_idate ]
    

    结果:

    > dt[xx>begin_idate  & xx<=end_idate ]
       begin   end x begin_idate  end_idate
    1: 16076 16080 J  2014-01-06 2014-01-10
    2: 16077 16082 J  2014-01-07 2014-01-12
    3: 16078 16084 J  2014-01-08 2014-01-14
    

    其实结果是相等的:

    all.equal(dt[as.Date('2014-01-09')>begin_idate  & as.Date('2014-01-09')<=end_idate ],
              dt[xx>begin_idate  & xx<=end_idate ]) # TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多