Из комментариев к вопросу проблема не в том, как рассчитать разницу между двумя временами, используя 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) Используйте метод name__class
sqldf (обратите внимание на двойное подчеркивание, чтобы указать класс для преобразования:
sqldf("select dif as dif__numeric from DF", method = "name__class")
## dif
## 1 1
person
G. Grothendieck
schedule
18.04.2016
sqldf
? - person Kunal Puri   schedule 18.04.2016sqldf
. - person Kunal Puri   schedule 18.04.2016