Из комментариев к вопросу, проблема заключается не в том, как вычислить разницу в два раза, используя 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"
, поэтому эвристика, назначающая классы, не будет пытаться ее преобразовать.
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
Нужны ли это сделать с помощью 'sqldf' –
Может вы отправляете запрос, который вы используете? –
всего $ TimeDispatched <- as.POSIXlt (strptime (всего $ TimeDispatch, format = '% m /% d /% y% H:% M:% S')) всего $ TimeArrived <- as.POSIXlt (strptime (total $ TimeArrive, format = '% m /% d /% y% H:% M: S')) всего $ diff <- difftime (всего $ TimeDispatched, total $ TimeArrived, units = c (авто)) q2 <- sqldf ('выберите avg (diff) как Avg_Arrival_time из общего числа, где diff не является нулевой группой от PoliceDistrict). Проблема в том, что мне нужно позже сгруппировать их с SQL и sqldx не очень хорошо с POSIXct date –