我在R中有一个值向量,希望从sqlite数据库中获取响应值。我使用以下代码。
values = c()
for (a in keys)
{
result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a)
values = c(values,results)
}
不幸的是,这个代码非常慢。有更有效的方法吗?
谢谢,
Johannes
如果aacontent不是很大,那么将其全部读取到R中,并使用类似R的匹配函数、sqldf函数或data.table函数
如果aacontent太大而keys太小,那么将keys写入sqlite表并执行联接查询。您可能会从对其中一个或两个创建索引中受益。
这些当然是R中为SQL查询任务预先构建的工具(由于您使用的是SQLite,我一定会查看sqldf),但根据我的经验,我最终只编写了许多用于构建查询的小助手包装函数。
例如,在您的案例中,您的问题实际上不是R部分,而是您想将keys
中的所有值滚动到一个查询中。所以你想要一个看起来更像的查询
SELECT content FROM aacontent WHERE Id IN (val1,val2,...)
然后技巧是使用R中的CCD_ 2来构建CCD_。我倾向于在dbGetQuery
上使用一个简单的包装器函数,该函数使用...
参数和paste
将不同部分的查询缝合在一起。类似这样的东西:
myQuery <- function(con,...){
arg <- list(...)
res <- dbGetQuery(con,paste(arg,collapse = ""))
res
}
因此,当使用IN
子句时,将东西缝合在一起会更容易:
myQuery(con,"SELECT content FROM aacontent WHERE Id IN (",
paste(keys,collapse = ","),"))
请注意,如果keys
中的值是字符,那就有点困难了,因为那时您需要对paste
做更多的工作来在每个元素周围获得单引号,但这并不是更多的工作。
如果所讨论的数据库相当小,那么这个建议就更有意义了;如果你正在处理更大的数据,Spacedman的建议可能更值得研究。