我使用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)
如何正确地将列表中的数据框名称传递给函数?
答案 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。