R:将数据帧列表传递给 sqldf 函数
R: Passing a list of data frames to a sqldf function
我有一个包含一些数据框的列表
myList <- list("A"=A, "B"=B)
我需要将每个数据帧传递给一个函数,该函数将在通过 sql 查询进行内部处理后 return 另一个数据帧列表。
myFunction <- function(x){
inner.processing.1 <- sqldf(sprintf("SELECT
// do something
FROM '%s'", x$A))
inner.processing.2 <- sqldf(sprintf("SELECT
// do something
FROM '%s'", x$B))
inner.list <- list("C"=inner.processing.1,"D"=inner.processing.2)
return(inner.list)
}
myFunction(myList)
x$A、x$B 方法给出错误“$ operator is invalid for atomic vectors”。我该如何解决?
代码有两个主要问题:
在 SQL 语句中 from
需要后跟数据框的 name 但代码试图传递数据框本身而不是它的名称
输入数据帧位于 sqldf
无法访问的列表中,除非将它们放在环境中并且 sqldf
语句被告知要查看哪个环境
以内置数据框BOD
为例:
f <- function(L) { # L is named list of 2 data frames
e <- list2env(L)
list(
C = fn$sqldf("select * from `names(L)[1]`", envir = e),
D = fn$sqldf("select * from `names(L)[2]`", envir = e)
)
}
library(sqldf)
f(list(A = BOD, B = 2 * BOD))
给予:
$C
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
$D
Time demand
1 2 16.6
2 4 20.6
3 6 38.0
4 8 32.0
5 10 31.2
6 14 39.6
注:以上假设你只知道运行时的数据帧名称。如果您在编写函数时知道它们,那么可以简单地对它们进行硬编码:
f2 <- function(L) { # L is named list of 2 data frames
e <- list2env(L)
list(
C = sqldf("select * from A", envir = e),
D = sqldf("select * from B", envir = e)
)
}
library(sqldf)
f2(list(A = BOD, B = 2 * BOD))
给出与之前所示相同的结果。
我有一个包含一些数据框的列表
myList <- list("A"=A, "B"=B)
我需要将每个数据帧传递给一个函数,该函数将在通过 sql 查询进行内部处理后 return 另一个数据帧列表。
myFunction <- function(x){
inner.processing.1 <- sqldf(sprintf("SELECT
// do something
FROM '%s'", x$A))
inner.processing.2 <- sqldf(sprintf("SELECT
// do something
FROM '%s'", x$B))
inner.list <- list("C"=inner.processing.1,"D"=inner.processing.2)
return(inner.list)
}
myFunction(myList)
x$A、x$B 方法给出错误“$ operator is invalid for atomic vectors”。我该如何解决?
代码有两个主要问题:
在 SQL 语句中
from
需要后跟数据框的 name 但代码试图传递数据框本身而不是它的名称输入数据帧位于
sqldf
无法访问的列表中,除非将它们放在环境中并且sqldf
语句被告知要查看哪个环境
以内置数据框BOD
为例:
f <- function(L) { # L is named list of 2 data frames
e <- list2env(L)
list(
C = fn$sqldf("select * from `names(L)[1]`", envir = e),
D = fn$sqldf("select * from `names(L)[2]`", envir = e)
)
}
library(sqldf)
f(list(A = BOD, B = 2 * BOD))
给予:
$C
Time demand
1 1 8.3
2 2 10.3
3 3 19.0
4 4 16.0
5 5 15.6
6 7 19.8
$D
Time demand
1 2 16.6
2 4 20.6
3 6 38.0
4 8 32.0
5 10 31.2
6 14 39.6
注:以上假设你只知道运行时的数据帧名称。如果您在编写函数时知道它们,那么可以简单地对它们进行硬编码:
f2 <- function(L) { # L is named list of 2 data frames
e <- list2env(L)
list(
C = sqldf("select * from A", envir = e),
D = sqldf("select * from B", envir = e)
)
}
library(sqldf)
f2(list(A = BOD, B = 2 * BOD))
给出与之前所示相同的结果。