使用R中的日期向量过滤data.table

时间:2018-03-04 21:58:33

标签: r data.table

如何创建数据向量来过滤data.table?

timeframe = as.Date(seq(ISOdate(1997,06,12), Sys.time(), "weeks")) 
timeframe2 = c("1997-06-12", "1997-06-19") 

tmp = data[Name == "aaa" & Date %in% timeframe] #doesn't return data
tmp = data[Name == "aaa" & Date %in% timeframe2] #returns data

tmp只返回第二个timeframe2变量的数据(我只显示timeframe2作为示例,表明tmp应该返回数据)

3 个答案:

答案 0 :(得分:3)

你正在混淆对象类型。在您的示例中,timeframeDate向量,而timeframe2character向量。

“过滤”向量的工作方式会有所不同,具体取决于data中的列类型。

这是一个展示的例子。

library(data.table)

dts <- c("2018-03-05", "2018-03-06")

## creating a data.table with 3 columns, a character, Date and POSIXct
dt <- data.table(
    date1 = dts,
    date2 = as.Date(dts),
    date3 = as.POSIXct(dts, tz = "Australia/Melbourne")
)

## create a character vector as the filter
timeframe <- c("2018-03-05")  

成功 - 按character向量过滤character

dt[date1 %in% timeframe]
# date1      date2      date3
# 1: 2018-03-05 2018-03-05 2018-03-05

失败 - 按Date向量过滤character

dt[date2 %in% timeframe]
# Empty data.table (0 rows) of 3 cols: date1,date2,date3

成功 - 按Date向量过滤Date

dt[date2 %in% as.Date(timeframe)]
# date1      date2      date3
# 1: 2018-03-05 2018-03-05 2018-03-05

失败 - 按POSIXct向量过滤character

dt[date3 %in% timeframe]
# Empty data.table (0 rows) of 3 cols: date1,date2,date3

成功 - 按POSIXct向量过滤POSIXct

dt[date3 %in% as.POSIXct(timeframe)]
#         date1      date2      date3
# 1: 2018-03-05 2018-03-05 2018-03-05

答案 1 :(得分:2)

我认为数据框data具有Date类型的character列。这就是为什么过滤器适用于timeframe2timeframe类型为Date且过滤器不起作用的原因。

一个修复可能是将Date列的类型更改为Date中的data 其他选项可以将timeframe转换为{ {1}}。例如:

character

答案 2 :(得分:1)

很难效仿你的例子,但我认为你给出了两个你可能想要过滤的日期向量的例子?

如果您想要同时进行过滤,则需要确保不要用#2覆盖#1。在第二行中,您可能希望改为使用

timeframe = c(timeframe,"1997-06-12", "1997-06-19")

这将创建一个包含所需日期的矢量(它只是将您想要的两个矢量粘在一起)。

然后按原样过滤。