如何将列表中的dataframe名称传递给sqldf?

时间:2014-07-10 09:12:35

标签: r sqldf

我使用sqldf包注释了几个数据帧。 注释数据位于数据框 annot 中。 我使用 INNER JOIN id

选择相应的信息

为了使过程自动化,我编写了以下代码:

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)

如何正确地将列表中的数据框名称传递给函数?

1 个答案:

答案 0 :(得分: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。