簡體   English   中英

R:將數據幀列表傳遞給sqldf函數

[英]R: Passing a list of data frames to a sqldf function

我有一些數據框的清單

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方法給出錯誤“ $運算符對於原子向量無效”。 我該如何解決?

該代碼有兩個主要問題:

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

得出與先前所示相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM