我正在尝试在R中加载具有USERID和Date的数据集。我试图使用sqldf拉取用户ID的MIN(DATE),但似乎结果有问题。
我使用posixct转换了日期列,并检查了typeof列,它显示了double(转换前它是整数)
test$C_DATE <- as.POSIXct(test$C_DATE, format = c("%m-%d-%Y %H:%M"))
minDate <- sqldf("SELECT U_ID,MIN(C_DATE) AS FTrans FROM test WHERE U_ID = 'ABC' GROUP BY U_ID")
预期的产出应该是
U_ID FTrans
ABC 12/20/2017 5:00:47 PM
但我明白了
U_ID FTrans
ABC 1507631400
我尝试使用SQL中的日期函数作为以下查询
minDate <- sqldf("SELECT U_ID,DATE(MIN(C_DATE),'unixepoch','localtime') AS FTrans FROM test WHERE U_ID = 'ABC' GROUP BY U_ID")
但是我得到了错误的日期以及错误的格式。
U_ID FTrans
ABC 2017-10-10
样本数据
UID C_DATE
ABC 10/11/15 9:05
ABC 10/11/15 20:08
DEF 10/11/15 11:37
GHI 10/11/15 20:08
JKL 10/11/15 2:46
理想情况下,对于用户ABC,我想要第一个记录的数据(MIN DATE),即10/11/15 9:05
任何帮助,将不胜感激。谢谢。
1)sqlite问题是sqlite(默认后端)没有日期/时间类型,所以POSIXct值被发送并作为原始数字返回。无法确定从sqlite返回的数字是否应该代表POSIXct值,但sqldf根据其名称猜测是什么。由于C_DATE在输入中是POSIXct,它将假定返回的任何C_DATE列应转换为POSIXct,因此只需使用C_DATE作为列名而不是FTrans。使用最后注释中可重复显示的数据,我们使用:
library(sqldf)
test$C_DATE <- as.POSIXct(test$C_DATE, format = "%m/%d/%y %H:%M")
sqldf("SELECT UID, MIN(C_DATE) AS C_DATE
FROM test
WHERE UID = 'ABC'
GROUP BY UID")
赠送:
UID C_DATE
1 ABC 2015-10-11 09:05:00
如果您阅读?sqldf
,还有其他方法可以告诉sqldf列类型。
2)h2处理此问题的另一种方法是使用h2后端数据库,因为它支持日期/时间。如果加载RH2驱动程序,sqldf会注意到它并使用该数据库后端。除了修复使用正确的列名之外,这与问题中的相同。和以前一样,我们使用下面的注释中的test
。
library(RH2)
library(sqldf)
sqldf("SELECT UID, MIN(C_DATE) AS FTrans
FROM test
WHERE UID = 'ABC'
GROUP BY UID")
赠送:
UID FTrans
1 ABC 2015-10-11 09:05:00
Lines <- "UID,C_DATE
ABC,10/11/15 9:05
ABC,10/11/15 20:08
DEF,10/11/15 11:37
GHI,10/11/15 20:08
JKL,10/11/15 2:46"
test <- read.csv(text = Lines, strip.white = TRUE)
test$C_DATE <- as.POSIXct(test$C_DATE, format = "%m/%d/%y %H:%M")
这个答案属于评论,但我没有足够的声誉发表评论。
as.POSIXct()
中的format参数是函数将遇到的格式,而不是最终格式。所以,你需要先调整as.POSIXct()
的调用:
test$C_DATE <- as.POSIXct(test$C_DATE, format = c("%m/%d/%y %H:%M"))
使用sqldf查找最小日期后,您可以使用format.POSIXct()
重新格式化日期。
希望有所帮助。
这是包library(tidyverse)
的解决方案
> test %>%
+ group_by(UID) %>%
+ summarize(mindate = min(C_DATE))
# A tibble: 4 x 2
UID mindate
<chr> <dttm>
1 ABC 2015-10-11 09:05:00
2 DEF 2015-10-11 11:37:00
3 GHI 2015-10-11 20:08:00
4 JKL 2015-10-11 02:46:00