【问题标题】:How to pass the name of dataframe inside a list to sqldf?如何将列表中的数据框名称传递给 sqldf?
【发布时间】:2014-08-31 14:17:53
【问题描述】:

我正在使用 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 函数 并将带注释的数据保存在后缀为“annotated”的新数据框中

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)

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

【问题讨论】:

    标签: r sqldf


    【解决方案1】:

    我无法复制您的错误。此外,这样使用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。

    【讨论】:

    • 谢谢弗利克先生!您的解决方案有效,我应该使用 lapply 功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2011-04-02
    • 2011-11-24
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多