有一种简单的方法可以使用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)
这种情况有哪些选择?
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#10csvread的sqldf主页上还有一些使用sq来自sqldf的H2的例子.
如果您真的想使用RSQLite包作为后端,那么您可以与RSQLite包维护者讨论是否可以增加999限制,或者您可以构建具有更高限制的RSQLite的私有版本.
编辑:
修改上面的代码以使用,fac2num并且还说明了从H2设置列类型的第二种方法.见FAQ#10.
| 归档时间: |
|
| 查看次数: |
901 次 |
| 最近记录: |