Использование оператора INSERT в sqldf в R

Я пытаюсь использовать sqldf для вставки строк в существующий (но пустой) фрейм данных и получаю странную ошибку.

Вот мой код:

set.seed(1)

library(sqldf)

# define empty dataframe
d1 = data.frame(min_x=numeric(), max_x=numeric())

# create a data frame of random numbers
d2 = data.frame(x=runif(10))

# This works fine
sqldf("select min(x), max(x) from d2")

# But, the following statement generates an error 
sqldf("insert into d1 select min(x), max(x) from d2")

Вот результат:

Не уверен, как это исправить. Я запускаю R 3.1.0 на 64-битной машине с Windows 7.

>     set.seed(1)
>     
>     library(sqldf)
>     
>     # define empty dataframe
>     d1 = data.frame(min_x=numeric(), max_x=numeric())
>     
>     # create a data frame of random numbers
>     d2 = data.frame(x=runif(10))
>     
>     # This works fine
>     sqldf("select min(x), max(x) from d2")
      min(x)    max(x)
1 0.06178627 0.9446753
>     
>     # But, the following statement generates an error 
>     sqldf("insert into d1 select min(x), max(x) from d2")
Error in sqliteExecStatement(con, statement, bind.data) : 
  RS-DBI driver: (error in statement: no such table: d1)
In addition: Warning message:
In value[[3L]](cond) : bind.data must have non-zero dimensions
> 

Что я делаю не так? Заранее спасибо.


person Karthik    schedule 24.06.2014    source источник
comment
Как указано в сообщении об ошибке, нет таблицы d1 для вставки.   -  person G. Grothendieck    schedule 24.06.2014
comment
Да, но я создал его выше. d1 = data.frame(min_x=числовой(), max_x=числовой())   -  person Karthik    schedule 24.06.2014
comment
Это потому, что он не может работать с фреймами данных, имеющими нулевые размеры, как указано в предупреждении.   -  person G. Grothendieck    schedule 24.06.2014


Ответы (1)


1) Как указано в предупреждении, он не может работать с фреймами данных с нулевым размером, поэтому, если вы действительно хотите это сделать, попробуйте следующее:

# before running this be sure that data frame d1 does NOT exist

sqldf(c("create table d1(min_x real, max_x real)", 
        "insert into d1 select min(x), max(x) from d2", 
        "select * from d1"))

Похоже, это проблема с драйвером RSQLite, который использует sqldf, и если вы считаете, что это возможно, то это должно быть исправлено в этом пакете.

2) Если вы хотите сменить базу данных, вы можете это сделать. Драйвер RH2 для базы данных H2 не имеет этой проблемы. и мы можем указать sqlidf использовать его, просто загрузив RH2 до выдачи оператора sqldf - если sqldf заметит, что загружен RH2, то он предполагает, что вы хотите использовать его вместо SQLite.

library(RH2)

Затем введите код в вопросе, за исключением замены последней строки на:

sqldf(c("insert into d1 select min(x), max(x) from d2", "select * from d1"))

так как код в вопросе ничего не вернул.

person G. Grothendieck    schedule 24.06.2014
comment
Понятно. Я установил и загрузил RH2 в соответствии с вашим предложением и изменил свой последний оператор на: d1 = sqldf(c(вставить в d1, выбрать min(x), max(x) из d2, выбрать * из d1)) и это сработало нормально. Спасибо за помощь. - person Karthik; 24.06.2014