我在R中有一个名为“ data
”的数据框。 EventDate
列为date format
,其余为double或字符字段。
我正在尝试从“ data
”中提取大多数列,但是将aggregate
的{{1}}值设置为年月指定,而不是当前的年月日指定(所以我想以01-2018、02-2018、03-2018等作为行值结束)。
在base R上执行此操作或找到任何易于执行的软件包时遇到很多麻烦。我在SQL方面比R有更多的经验,所以我选择使用sqldf软件包。
这是我写的代码:
EventDate
该代码执行没有任何问题,并且产生了大部分正确的结果,只不过它为newdata <- sqldf("SELECT ID1, ID2, ID3, Staff, Type, POC, TOC1, TOC2, TOC3, CASE
WHEN EventDate >= '2018-01-01' AND EventDate < '2018-02-01' THEN 'Jan 2018'
WHEN EventDate >= '2018-02-01' AND EventDate < '2018-03-01' THEN 'Feb 2018'
WHEN EventDate >= '2018-03-01' AND EventDate < '2018-04-01' THEN 'Mar 2018'
WHEN EventDate >= '2018-04-01' AND EventDate < '2018-05-01' THEN 'Apr 2018'
WHEN EventDate >= '2018-05-01' AND EventDate < '2018-06-01' THEN 'May 2018'
WHEN EventDate >= '2018-06-01' AND EventDate < '2018-07-01' THEN 'Jun 2018'
WHEN EventDate >= '2018-07-01' AND EventDate < '2018-08-01' THEN 'Jul 2018'
WHEN EventDate >= '2018-08-01' AND EventDate < '2018-09-01' THEN 'Aug 2018'
WHEN EventDate >= '2018-09-01' AND EventDate < '2018-10-01' THEN 'Sep 2018'
WHEN EventDate >= '2018-10-01' AND EventDate < '2018-11-01' THEN 'Oct 2018'
WHEN EventDate >= '2018-11-01' AND EventDate < '2018-12-01' THEN 'Nov 2018'
WHEN EventDate >= '2018-12-01' AND EventDate < '2019-01-01' THEN 'Dec 2018'
END AS EventMonth
FROM data
ORDER BY EventMonth, Staff, ID1")
的{{1}}列中的所有行而不是NA
返回了EventMonth
等
“ newdata
”中的"Jan 2018", "Feb 2018"
列可能是格式问题,但是EventDate
在RStudio中被列为日期类型,并且在data
中。
在运行之前的代码作为健全性检查之前,我还尝试运行以下命令(不会出错或不会发出任何警告),但是它仍然为我提供了EventMonth充满NA的列:
data$EventDate
当我在SQL Server中运行它时,SQL产生了预期的结果(EventMonth列中没有NA),但是不幸的是,我将永远无法访问SQL Server,这就是为什么我不愿意这样做完全是R。
我需要一种无需实际的SQL数据库引擎即可执行此操作的方法,以便将来执行类似的聚合。我最近在上个月内安装了yyyy-mm-dd format
,data$EventDate <- as.Date(data$EventDate)
和R
软件包,所以我不应该使用任何过时的工具。
是否可以使用 sqldf,基本R或某些其他R包来获得所需的结果?
答案 0 :(得分:0)
是否可以使用SQLquery代替sqldf。如果是,您的查询可能会以这种方式工作。
我在SQL Server中有一个这样的表。
您可以使用R连接到SQL Server。
library(odbc)
library(RODBC)
library(sqldf)
conn <- odbcDriverConnect('driver={SQL Server};server=
YOURserver;database=Yourdatabase;trusted_connection=true')
Datanew <- sqlQuery(conn,"SELECT ID,Dates,Amount ,
case when Dates >= '2018-01-01' and Dates < '2018-02-01' then 'Jan 2018'
when Dates >= '2018-02-01' and Dates < '2018-03-01' then 'Feb 2018'
when Dates >= '2018-03-01' and Dates < '2018-04-01' then 'Mar 2018'
end as Months,
format(dates,'MMM yyyy') NewapproachDates
FROM dbo.practicR;");
View(Datanew)
您将日期转换为月和年的case语句是正确的,但是这种格式功能将更加容易,因为您不必像在case语句中那样每次都给出日期范围。日期有两列(一种是您提供的方式,另一种是新方式)
输出是这样: