我正在尝试基于某些日期部分提取并加入2个数据框,但无法正常工作。数据帧如下:-
startdf
startperiod
2015-10-01
2016-10-01
2017-10-01
2018-10-01
enddf
endperiod
2016-03-31
2017-03-31
2018-03-31
startperiod
和endperiod
均为'Date'数据类型
这是我想要的最终输出:-
startperiod, endperiod
2015-10-01 2016-03-31
2016-10-01 2017-03-31
2017-10-01 2018-03-31
2018-10-01 Null
等效的SQL将是这样的:-
Select startperiod, endperiod
From startdf a lef join enddf b
On year(b.endperiod) = (year(a.startperiod) + 1)
在R中有什么方法可以做吗?我相信我需要使用库sqldf
和RH2
,但是无论如何我都无法使用它。
简单地说,这应该可以,但是不可以!
sqldf("Select * from startperioddf a where year(startperiod) = 2016")
答案 0 :(得分:1)
1)RH2 假设
startdate
和enddate
属于Date
类。然后您的代码有效:
library(sqldf)
library(RH2)
sql <- "Select startperiod, endperiod
From startdf a left join enddf b
On year(b.endperiod) = (year(a.startperiod) + 1)"
sqldf(sql)
给予:
startperiod endperiod
1 2015-10-01 2016-03-31
2 2016-10-01 2017-03-31
3 2017-10-01 2018-03-31
4 2018-10-01 <NA>
也
sqldf("Select * from startdf a where year(startperiod) = 2016")
给予:
startperiod
1 2016-10-01
请务必阅读sqldf github网站上的资料:https://github.com/ggrothendieck/sqldf
2)sqlite 如果要使用默认的sqlite后端,请确保未加载RH2(否则,它将假定您要使用它),并请注意Date类变量将是作为整数上传到sqlite,代表自unix纪元以来的天数(因为sqlite中没有Date类类型),因此我们需要将epoch以来的天数转换为年份(可以使用strftime
完成,如图所示)
sql2 <- "Select startperiod, endperiod
From startdf a left join enddf b
On strftime('%Y', b.endperiod * 3600 * 24, 'unixepoch') + 0 =
strftime('%Y', a.startperiod * 3600 * 24, 'unixepoch') + 1"
sqldf(sql2)
sqldf("Select * from startdf a
where strftime('%Y', a.startperiod * 3600 * 24, 'unixepoch') = '2016'")
Lines1 <- "
startperiod
2015-10-01
2016-10-01
2017-10-01
2018-10-01"
Lines2 <- "
endperiod
2016-03-31
2017-03-31
2018-03-31"
startdf <- read.table(text = Lines1, header = TRUE, colClasses = "Date")
enddf <- read.table(text = Lines2, header = TRUE, colClasses = "Date")
答案 1 :(得分:0)
R中的sqldf
软件包默认情况下使用SQLite
数据库引擎。因此,您无法在查询中使用year
函数从日期中提取年份部分。以下查询将完成这项工作:
sqldf("Select * from startdf where strftime('%Y', startperiod) = '2016'")
它使用SQLite的strftime
函数比较特定日期部分。 year
函数是在MySQL
下定义的,因此您可能必须安装RMySQL
软件包,然后使用drv = 'MySQL'
参数指定所需的数据库引擎{{1} }。