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