将列表传递给sqldf

时间:2017-10-12 21:08:00

标签: r sqldf

我有一个数据帧列表,我想执行合并。如何将列表中的每个元素传递给相应的sqldf语句? 我的代码如下:

require(sqldf)
a <- data.frame(ID=c("a","b","c","d","a","a"),num=1:6,num2=2:7)
b <- data.frame(ID=c("d","a","a","a","b","c"),num=6:1,num2=7:2)
Datalist <- list(a,b)
mergeto <- data.frame(ID=c("a","a","a","b","c","d"),name=rep("A",6),name2=rep("B"),6)
test <- sqldf("
select *
from Datalist[[1]] as a left outer join mergeto as b
where a.ID = b.ID and
")

我收到错误:

rsqlite_send_query中的错误(conn @ ptr,statement):   无法识别的令牌:&#34;]&#34;

有没有办法直接从R使用列表变量?我的意思是我知道我可以使用a <- Datalist[[1]]然后在sqldf语句中使用a,但是这样每次创建Datalist元素的副本并且Datalist已经非常大了......我肯定在那里必须是一种方式。还要直接访问包含字符串的变量,必须有办法吗? 所以我最后要做的是在循环中执行SQL语句,所以我还必须能够在语句中更改索引。但因为它是一个字符串,它似乎不再容易实现。

1 个答案:

答案 0 :(得分:3)

在评论中尝试@Gregor已经概述的以下内容,但在此我们将其明确化。我们使用名为的列表L,其中包含三个数据帧,每个数据帧等于内置BOD数据帧,并将第二个和后续数据帧连接到第一个{ {1}}从两部分构造SQL语句Time的文本:sql(包含select和from的字符串)和sel_from(连接定义的字符向量)

joins

这给出了以下输出:

library(sqldf)

L <- list(BOD1 = BOD, BOD2 = BOD, BOD3 = BOD) # named list as input
nms <- names(L)
sel_from <- sprintf("select * from %s", nms[1])
joins <- sprintf("join %s on %s.Time = %s.Time", nms[-1], nms[-1], nms[1])
sql <- paste(c(sel_from, joins), collapse = "\n")
sqldf(sql, envir = list2env(L))

我们也可以像这样查看 Time demand Time demand Time demand 1 1 8.3 1 8.3 1 8.3 2 2 10.3 2 10.3 2 10.3 3 3 19.0 3 19.0 3 19.0 4 4 16.0 4 16.0 4 16.0 5 5 15.6 5 15.6 5 15.6 6 7 19.8 7 19.8 7 19.8 的内容:

sql

,并提供:

cat(sql, "\n")