过滤data.table的日期问题 - 使用固定日期但不使用变量

时间:2015-05-06 12:26:13

标签: r date data.table

我想过滤日期的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

1 个答案:

答案 0 :(得分:7)

这是因为data.table的其中一列名为x。当data.table计算其第一个参数(您正在使用的参数)时,它首先查找x作为列引用。所以实际上x>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