代码之家  ›  专栏  ›  技术社区  ›  Randy Bale

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

  •  1
  • Randy Bale  · 技术社区  · 8 年前

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

    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方法给出错误“$运算符对原子向量无效”。如何修复此问题?

    1 回复  |  直到 8 年前
        1
  •  2
  •   G. Grothendieck    8 年前

    该代码有两个主要问题:

    • 在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))
    

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

    推荐文章