RSQLite - хранить столбцы даты как символ в SQLite

Есть ли способ, как я могу хранить даты в фрейме данных R в виде строк символов в SQLite, используя RSQLite? В настоящее время столбцы даты хранятся как целые числа. Я, вероятно, могу преобразовать все даты в строки перед записью в SQLite, но поскольку мне нужно писать в SQLite из функции, где фрейм данных является одним из аргументов, я бы предпочел избежать такого преобразования.

library('RSQLite')

df <- data.frame(
        x=1:3, 
        y=as.Date(c('2011-01-01','2011-03-03','2011-12-31'))
      )

df

# Create connection and temporary database
sqlite <- dbDriver("SQLite")
tmpdb  <- dbConnect(sqlite,"__this_is_temporary_db__.db")           

# Write data    
dbWriteTable(tmpdb,'df',df)

# We get integers from date
dbGetQuery(tmpdb,'select * from df')

dbDisconnect(tmpdb)      

# file.remove('__this_is_temporary_db__.db')

person Tomas Greif    schedule 13.12.2013    source источник
comment
См. github.com/rstats-db/RSQLite/issues/17.   -  person hadley    schedule 13.12.2013


Ответы (1)


Вы должны принуждать к характеру. Вы можете сделать это для всех столбцов даты data.frame, используя что-то вроде этого:

ll <- lapply(df,function(x) 
     if(inherits (x,c('POSIXct','Date'))
       as.character(x)
     else x))
do.call(rbind.data.frame,ll)
person agstudy    schedule 13.12.2013
comment
... основная причина в том, что у sqlite нет собственного типа даты. И R хранит даты внутри как целые числа. Поэтому, если вам нужен персонаж, вы должны отправить его в sqlite таким образом. - person joran; 13.12.2013
comment
И когда вы принудительно вводите текстовое поле, например. с dbSendQuery(tmpdb, "CREATE TABLE df (x INTEGER, y TEXT )"); dbSendPreparedQuery(tmpdb,"INSERT into df values ( ?, ?)",bind.data=df) он преобразуется в реальный текст. - person Dieter Menne; 13.12.2013
comment
@agstudy Это все еще неправильно. Текущая версия возвращает фрейм данных с 3 столбцами и 2 строками. Я думаю, что правильная версия должна быть: df[] <- lapply(df,function(x) if(inherits (x,c('POSIXct','Date'))) as.character(x) else x) - person Tomas Greif; 16.12.2013