R:将数据帧列表传递给sqldf函数

时间:2017-12-14 21:55:26

标签: r list function sqldf

我有一个包含一些数据框的列表

myList <- list("A"=A, "B"=B)

我需要将每个数据帧传递给一个函数,该函数在通过sql查询进行内部处理后将返回另一个数据帧列表。

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方法给出错误&#34; $运算符对原子向量&#34;无效。我该如何解决?

1 个答案:

答案 0 :(得分:2)

代码有两个主要问题:

  • 在SQL语句from中需要跟随数据框的名称,但代码试图传递数据框本身而不是其名称

  • 输入数据框位于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))

给出与前面所示相同的结果。