我在数据框中有两列我需要计算时间差。数据是来自城市开放数据的本地PD数据。一列在下面
TimeDispatch
01/01/2011 12:00:37 AM
TimeArrive
01/01/2011 12:21:31 AM
TimeArrival也是一些缺失值,因为每次调度都不需要警察到达。
我试图在R中使用sqldf找到差异,但它说出了这个错误
Error in sqliteSendQuery(conn, statement, bind.data) :
RAW() can only be applied to a 'raw', not a 'double'
In addition: Warning message:
In sqliteSendQuery(con, statement, bind.data) :
Closing result set with pending rows
任何帮助人员?
答案 0 :(得分:3)
从评论到问题,问题不在于如何使用sqlite计算两次差异。在将它们发送到sqlite之前,时间已经不同了,问题是生成的"difftime"
类列在发送到sqlite时会转换为数字,当它被检索回到R时,sqldf
会不知道如何将该数字转换回"difftime"
类对象,因为它不知道要使用哪个单位。
这是一个自包含的例子来说明:
library(sqldf)
now <- Sys.time()
now2 <- now + 1
dif <- difftime(now2, now)
DF <- data.frame(dif)
sqldf("select * from DF")
## Error in asfn(rs[[i]]) : need explicit units for numeric conversion
有几种方法:
1)首先不要使用"difftime"
对象。使用秒数或分钟数或其他任何数字变量:
DF1 <- data.frame(dif = as.numeric(dif))
sqldf("select * from DF1")
## dif
## 1 1
2)在SQL中而不是在R中执行差异,以便首先不创建"difftime"
列:
DF2 <- data.frame(now, now2)
sqldf("select now2 - now as dif from DF2")
## dif
## 1 1
3)使用sqldf(..., method = "raw")
阻止它尝试转换回"difftime"
类:
sqldf("select * from DF")
## dif
## 1 1
4)确保在输出中重命名原始"difftime"
列,以便它不能将其与原始"difftime"
列关联,因此分配类的启发式操作不会尝试转换它。
sqldf("select dif as dif2 from DF")
## dif2
## 1 1
5)使用sqldf的name__class
方法(注意双下划线指定要转换为的类:
sqldf("select dif as dif__numeric from DF", method = "name__class")
## dif
## 1 1
答案 1 :(得分:1)
我实际上找到了答案。只需使用as.integer()
将difftime变量转换为整数。我阅读了很多博客,我无法在任何地方找到答案,所以我发布答案以供将来参考