2014-07-10 67 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

相关问题