将列表传递给 sqldf
Passing lists to 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, 语句) 错误:
无法识别的标记:“]”
有什么方法可以直接从 R 中使用列表变量吗?我的意思是我知道我可以在 sqldf 语句中使用 a <- Datalist[[1]]
然后使用 a
,但是这样每次都会创建 Datalist 元素的副本并且 Datalist 已经非常大了..我确定有一定是个办法。还要直接访问包含字符串的变量,必须有办法吗?
所以我最后想做的是在循环中执行 SQL-statements,所以我还必须能够在语句中更改索引。但是因为它是一个字符串,所以似乎不再那么容易了。
试试@Gregor 在评论中已经概述的以下内容,但在这里我们将其明确化。我们使用一个 named 列表 L
由三个数据帧组成,每个数据帧等于内置的 BOD
数据帧,并将第二个和后续数据帧连接到首先在 Time
从两部分构建 SQL 语句 sql
的文本:sel_from
(包含 select 和 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")
给予:
select * from BOD1
join BOD2 on BOD2.Time = BOD1.Time
join BOD3 on BOD3.Time = BOD1.Time
我有一个数据框列表,我想对其执行合并。如何将列表的每个元素传递给相应的 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, 语句) 错误: 无法识别的标记:“]”
有什么方法可以直接从 R 中使用列表变量吗?我的意思是我知道我可以在 sqldf 语句中使用 a <- Datalist[[1]]
然后使用 a
,但是这样每次都会创建 Datalist 元素的副本并且 Datalist 已经非常大了..我确定有一定是个办法。还要直接访问包含字符串的变量,必须有办法吗?
所以我最后想做的是在循环中执行 SQL-statements,所以我还必须能够在语句中更改索引。但是因为它是一个字符串,所以似乎不再那么容易了。
试试@Gregor 在评论中已经概述的以下内容,但在这里我们将其明确化。我们使用一个 named 列表 L
由三个数据帧组成,每个数据帧等于内置的 BOD
数据帧,并将第二个和后续数据帧连接到首先在 Time
从两部分构建 SQL 语句 sql
的文本:sel_from
(包含 select 和 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")
给予:
select * from BOD1
join BOD2 on BOD2.Time = BOD1.Time
join BOD3 on BOD3.Time = BOD1.Time