如何创建数据向量来过滤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应该返回数据)
答案 0 :(得分:3)
你正在混淆对象类型。在您的示例中,timeframe
是Date
向量,而timeframe2
是character
向量。
“过滤”向量的工作方式会有所不同,具体取决于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
列。这就是为什么过滤器适用于timeframe2
但timeframe
类型为Date
且过滤器不起作用的原因。
一个修复可能是将Date
列的类型更改为Date
中的data
或其他选项可以将timeframe
转换为{ {1}}。例如:
character
答案 2 :(得分:1)
很难效仿你的例子,但我认为你给出了两个你可能想要过滤的日期向量的例子?
如果您想要同时进行过滤,则需要确保不要用#2覆盖#1。在第二行中,您可能希望改为使用
timeframe = c(timeframe,"1997-06-12", "1997-06-19")
这将创建一个包含所需日期的矢量(它只是将您想要的两个矢量粘在一起)。
然后按原样过滤。