首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R sqldf -循环内/外索引

R sqldf -循环内/外索引
EN

Stack Overflow用户
提问于 2017-11-06 20:31:15
回答 1查看 665关注 0票数 2

我使用sqldf函数重复地将表的子集与自身连接起来。重复过程在for循环中发生。我读过添加索引可以提高这些联接这里的性能。

我的问题是--如果我在循环中重复这样做,这是否意味着每次循环执行时我都必须重新创建索引,还是有一种方法让索引在循环之外“持久”,但在循环中使用呢?

换句话说,我只看过这个版本:

代码语言:javascript
复制
for(i in 1:10){
   df1 <- sqldf(c('create index...','select * from table1'))
}

有办法这样做吗?

代码语言:javascript
复制
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')
}

编辑:

代码语言:javascript
复制
> 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:

代码语言:javascript
复制
> 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-06 20:49:06

sqldf的无参数形式可以用于打开和关闭连接,这样中间的sqldf语句都可以使用相同的连接。

请注意,我们可以通过将表x引用为main.x来引用已经上载的表的版本;否则,每个sqldf将再次尝试上载该表。您还可以考虑将verbose = TRUE参数添加到标记为##的语句中,以查看发生了什么。

代码语言:javascript
复制
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主页上有一些例子。

另一种可能是直接使用RSQLite。

还请注意,您可以生成SQL字符串的向量,并将整个向量传递给sqldf:sqldf(v)

还有一种可能是使用SQLite递归公共表表达式。谷歌获得更多信息。

请注意,select以外的语句(如create)会在RSQLite 2.0下产生警告,但仍会给出正确的结果,因此要么忽略警告,要么使用较早版本的RSQLite。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47145260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档