是否有一种简单的方法可以使用RSQLite和`sqldf`以及超过999个变量?

Ryo*_*ogi 3 sqlite r

有一种简单的方法可以使用RSQLite并且sqldf有超过999个变量吗?

这个问题也在这里提出.关于R-sig-DB的答案

"这不起作用的原因似乎是sqlite源码中的SQLITE_MAX_VARIABLE_NUMBER(在RSQLite中)目前设置为999."

以下是一些示例代码:

# works fine
widedf <- rnorm(2*998)
dim(widedf) <- c(2, 998)
f2 <- tempfile()
write.csv(widedf, f2, quote = FALSE)

f2 <- file(f2)
widedf <- sqldf("select * from f2", 
                dbname = tempfile(), 
                file.format = list(header = T, row.names = F))

# doesn't work
widedf <- rnorm(2*1000)
dim(widedf) <- c(2, 1000)
f1 <- tempfile()
write.csv(widedf, f1, quote = FALSE)

f1 <- file(f1)
widedf <- sqldf("select * from f1", 
                dbname = tempfile(), 
                file.format = list(header = T, row.names = F))
# Error in try({ : 
#  RS-DBI driver: (RS_sqlite_import: too many SQL variables)
Run Code Online (Sandbox Code Playgroud)

这种情况有哪些选择?

G. *_*eck 6

sqldf也适用于某些其他数据库.尝试sqldf支持的H2 java数据库,它有一个csvread函数.如果你还没有安装java,然后安装RH2包(其中包含H2本身,那么没有其他东西可以安装).

第一种方法

library(RH2)
library(sqldf)

# create test file
widedf <- as.data.frame(matrix(rnorm(2*1000), 2))
write.csv(widedf, "widedf.csv", row.names = FALSE)

# fac2num is defined on sqldf home page in FAQ #10
w.out <- sqldf("select * from csvread('widedf.csv')", method = fac2num)
Run Code Online (Sandbox Code Playgroud)

第二种方法

第二种替代方法,在H2中设置类型而不是使用fac2num如下.第一行只读取第一行的widedf.csv使用read.csv,甚至删除它,以便我们得到一个空数据帧,但具有正确的列类.第二行将widedf.csv文件插入widedf0,然后在两个sql语句的第二行中选择它,以便sqldf调用的结果是新表.

widedf0 <- read.csv("widedf.csv", nrows = 1)[0L, ]
w2.out <- sqldf(c("insert into widedf0 (select * from csvread('widedf.csv'))", 
    "select * from widedf0"))
Run Code Online (Sandbox Code Playgroud)

在上述情况下,sqldf会注意到RH2已加载并假设您要使用H2作为后端数据库.(sqldf包还有一个drv参数和一个sqldf.driver选项,其中任何一个都可用于强制特定的后端,无论加载什么.)

FAQ#10csvreadsqldf主页上还有一些使用sq来自sqldf的H2的例子.

如果您真的想使用RSQLite包作为后端,那么您可以与RSQLite包维护者讨论是否可以增加999限制,或者您可以构建具有更高限制的RSQLite的私有版本.

编辑:

修改上面的代码以使用,fac2num并且还说明了从H2设置列类型的第二种方法.见FAQ#10.