我想比较一个结束日期(end_date)列的数据和系统日期(todays_date)。两列都是char格式。
Input:
$ name: chr "Abby" "Abby" "Abby" "Abby" ...
$ std: int 2 3 4 5 6 7 8 9 10 11 ...
$ end_date: chr "25-02-2016" "25-02-2016" "25-03-2018" "25-02-2019" ...
$ todays_date: chr "07-03-2018" "07-03-2018" "07-03-2018" "07-03-2018" ...
我有没有办法传递sqldf
语句,我可以获取输入csv的所有值,其中end_date<今天的日期?除sqldf
语句以外的任何方式,我可以提取csv的值,其中end_date< todays_date会做的。
我尝试了以下查询的一些可能的变体,但我似乎无法获得所需的输出:
sel_a <- sqldf(paste("SELECT * FROM input_a WHERE end_date<",
todays_date, "", sep = ""))
sel_a
PS:我有大量的数据,并且减少了它以适应这个问题。
任何帮助都将不胜感激。
答案 0 :(得分:1)
要获得更具体的答案,请制作reproducible example
将日期列从字符转换为日期时间对象,例如,使用
library(lubridate)
your_df$end_date <- mdy(your_df$end_date)
然后,您甚至不需要今天日期的列,只需将其用作过滤条件
library(dplyr)
filter(your_df, end_date < Sys.Date())
# will return a data frame with those rows that have a date before today.
或者如果您愿意:
your_df[your_df$end_date < Sys.Date(),]
# produces the same rows
答案 1 :(得分:1)
使用末尾注释中显示的原始输入,首先将日期转换为"Date"
类,然后使用显示的任何替代方法。前两个使用输入中的end_date
,后两个使用Sys.Date()
。我们展示了sqldf
和基础解决方案。
library(sqldf)
fmt <- "%d-%m-%Y"
Input <- transform(Input_raw, end_date = as.Date(end_date, fmt),
todays_date = as.Date(todays_date, fmt))
# 1
sqldf("select * from Input where end_date <= todays_date")
# 2
subset(Input, end_date <= todays_date)
# 3
fn$sqldf("select * from Input where end_date <= `Sys.Date()`")
# 4
subset(Input, end_date <= Sys.Date())
Input
可重现的形式:
Input_raw <- data.frame(name = "Abby", std = 2:5,
end_date = c("25-02-2016", "25-02-2016", "25-03-2018", "25-02-2019"),
todays_date = "07-03-2018", stringsAsFactors = FALSE)