在R中的sqldf中使用INSERT语句

时间:2014-06-24 16:42:41

标签: r sqldf

我正在尝试将 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")

这是输出:

不确定如何解决这个问题。我在使用Windows 7的64位计算机上运行R 3.1.0。

>     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
> 

我做错了什么?提前致谢。

1 个答案:

答案 0 :(得分:3)

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"))

这似乎是sqldf使用的RSQLite驱动程序的一个问题,如果您觉得这应该是可行的,那么它应该在该包中修复。

2)如果您愿意切换数据库,那么您可以这样做。 H2数据库的RH2驱动程序没有此问题。我们可以通过在发出sqldf语句之前加载RH2来告诉sqlidf使用它 - 如果sqldf注意到RH2已加载,那么它假定你想使用它而不是SQLite。

library(RH2)

然后在问题中发出代码,除了用以下代码替换最后一行:

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

因为问题中的代码没有返回任何内容。