2014-07-10 107 views
1

我使用sqldf包註釋了幾個數據幀。 註釋數據位於數據框註釋中。 我使用INNER JOIN通過ID值中選擇對應的信息如何將列表中的數據框名稱傳遞給sqldf?

要自動化的過程中,我寫代碼如下:

prepareAnnot <- function(x){ 
annoted <- sqldf("SELECT x.*, 
annot.* 
FROM x INNER JOIN annot 
ON x.id = annot.id;") 

return(annoted)} 

我把5個的數據幀(A,B,C ,d,E)到一個列表,並希望應用prepareAnnot功能 和保存後綴一個新的數據幀中的註釋數據「anotated」

myresults <- list(A=A,B=B,C=C,D=D,E=E) 

for (i in seq_along(myresults)){ 
assign (paste(names(myresults)[i],"annotated",sep="_"),prepareAnnot(myresults[i])) 
} 

但是,似乎prepareAnnot函數無法識別我的列表中的數據框名稱。 ,我得到了以下錯誤消息:

Error in sqliteExecStatement(con, statement, bind.data) : 
RS-DBI driver: (error in statement: no such table: x) 

應該如何我正確地傳遞給上述功能中的數據幀的名字嗎?

回答

2

我無法複製您的錯誤。此外,使用assign()就不是一個好主意。如果你有一堆相關的變量,最好把它們放在一個列表中,這樣你就可以很容易地對它們進行矢量化操作。這是一個工作示例

annot <- data.frame(id=1:10, n=letters[1:10]) 
prepareAnnot <- function(x) { 
    sqldf("select x.*, annot.n from x INNER JOIN annot ON x.id = annot.id") 
} 

myresults <- list(A=data.frame(id=1:3), B=data.frame(id=4:7))  
annotated <- lapply(myresults, prepareAnnot) 
annotated 

使用「sqldf_0.4-7.1」進行測試。

如果myresults中的其中一個元素不是data.frame,我可以得到相同的錯誤。一定要檢查

sapply(myresults, class) 

看到他們都是正確的data.frames。

+0

謝謝Flick先生!您的解決方案有效,我應該使用lapply功能。 – tky

相關問題