R sqldf - 在循环内/外索引
R sqldf - index inside / outside a loop
我正在使用 sqldf 函数重复连接 table 的一个子集。重复过程发生在 for 循环内。我读到添加索引可以提高这些连接的性能 here。
我的问题是 - 如果我在循环中重复执行此操作,这是否意味着每次循环执行时我都必须重新创建索引,或者是否有办法让索引 'persist' 在循环但在循环内部使用?
也就是说我只看过这个版本:
for(i in 1:10){
df1 <- sqldf(c('create index...','select * from table1'))
}
有没有办法做这样的事情:
df1 <- sqldf('create index...') # create index outside of loop
for(i in 1:10){
df2 <- sqldf('select * from t1 left join t2 on t1.col1 = t2.col1')
}
编辑:
> sqldf()
NULL
>
> sqldf("create index idx on iris(Species)") ##
data frame with 0 columns and 0 rows
> sqldf("select count(*) from main.iris where Species = 'virginica'") ##
Error in rsqlite_send_query(conn@ptr, statement) :
no such table: main.iris
> sqldf("select count(*) from main.iris where Species <> 'virginica'") ##
Error in rsqlite_send_query(conn@ptr, statement) :
no such table: main.iris
>
> sqldf()
<SQLiteConnection>
Path: :memory:
Extensions: TRUE
>
EDIT_2:
> sqldf()
NULL
> # close an old connection if it exists
> if (!is.null(getOption("sqldf.connection"))) sqldf()
> sqldf()
<SQLiteConnection>
Path: :memory:
Extensions: TRUE
> sqldf("create index idx on iris(Species)") ##
data frame with 0 columns and 0 rows
> sqldf("select count(*) from main.iris where Species = 'virginica'") ##
count(*)
1 50
> sqldf("select count(*) from main.iris where Species <> 'virginica'") ##
count(*)
1 100
> sqldf()
NULL
sqldf
的无参数形式可用于打开和关闭连接,以便中间 sqldf
语句都可以使用相同的连接。
注意,我们可以通过引用table x
为main.x
来引用已经上传的table的版本;否则,每个 sqldf
将尝试再次上传。您还可以考虑将 verbose = TRUE
参数添加到标记为 ## 的语句中以查看发生了什么。
library(sqldf)
sqldf()
sqldf("create index idx on iris(Species)") ##
sqldf("select count(*) from main.iris where Species = 'virginica'") ##
sqldf("select count(*) from main.iris where Species <> 'virginica'") ##
sqldf()
sqldf github home page上有一些例子。
另一种可能是直接使用RSQLite。
另请注意,您可以生成 SQL 个字符串的向量并将整个向量传递给 sqldf:sqldf(v)
另一种可能性是使用 SQLite 递归通用 Table 表达式。 Google 获取更多信息。
请注意,除 select
以外的语句(例如 create
)会在 RSQLite 2.0 下产生警告,但仍会给出正确的结果,因此请忽略该警告或使用早期版本的 RSQLite.
我正在使用 sqldf 函数重复连接 table 的一个子集。重复过程发生在 for 循环内。我读到添加索引可以提高这些连接的性能 here。
我的问题是 - 如果我在循环中重复执行此操作,这是否意味着每次循环执行时我都必须重新创建索引,或者是否有办法让索引 'persist' 在循环但在循环内部使用?
也就是说我只看过这个版本:
for(i in 1:10){
df1 <- sqldf(c('create index...','select * from table1'))
}
有没有办法做这样的事情:
df1 <- sqldf('create index...') # create index outside of loop
for(i in 1:10){
df2 <- sqldf('select * from t1 left join t2 on t1.col1 = t2.col1')
}
编辑:
> sqldf()
NULL
>
> sqldf("create index idx on iris(Species)") ##
data frame with 0 columns and 0 rows
> sqldf("select count(*) from main.iris where Species = 'virginica'") ##
Error in rsqlite_send_query(conn@ptr, statement) :
no such table: main.iris
> sqldf("select count(*) from main.iris where Species <> 'virginica'") ##
Error in rsqlite_send_query(conn@ptr, statement) :
no such table: main.iris
>
> sqldf()
<SQLiteConnection>
Path: :memory:
Extensions: TRUE
>
EDIT_2:
> sqldf()
NULL
> # close an old connection if it exists
> if (!is.null(getOption("sqldf.connection"))) sqldf()
> sqldf()
<SQLiteConnection>
Path: :memory:
Extensions: TRUE
> sqldf("create index idx on iris(Species)") ##
data frame with 0 columns and 0 rows
> sqldf("select count(*) from main.iris where Species = 'virginica'") ##
count(*)
1 50
> sqldf("select count(*) from main.iris where Species <> 'virginica'") ##
count(*)
1 100
> sqldf()
NULL
sqldf
的无参数形式可用于打开和关闭连接,以便中间 sqldf
语句都可以使用相同的连接。
注意,我们可以通过引用table x
为main.x
来引用已经上传的table的版本;否则,每个 sqldf
将尝试再次上传。您还可以考虑将 verbose = TRUE
参数添加到标记为 ## 的语句中以查看发生了什么。
library(sqldf)
sqldf()
sqldf("create index idx on iris(Species)") ##
sqldf("select count(*) from main.iris where Species = 'virginica'") ##
sqldf("select count(*) from main.iris where Species <> 'virginica'") ##
sqldf()
sqldf github home page上有一些例子。
另一种可能是直接使用RSQLite。
另请注意,您可以生成 SQL 个字符串的向量并将整个向量传递给 sqldf:sqldf(v)
另一种可能性是使用 SQLite 递归通用 Table 表达式。 Google 获取更多信息。
请注意,除 select
以外的语句(例如 create
)会在 RSQLite 2.0 下产生警告,但仍会给出正确的结果,因此请忽略该警告或使用早期版本的 RSQLite.