我正在尝试将 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
>
我做错了什么?提前致谢。
答案 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"))
因为问题中的代码没有返回任何内容。