【问题标题】:How to return a data.frame with a given name from a function?如何从函数返回具有给定名称的 data.frame?
【发布时间】:2011-05-01 19:20:18
【问题描述】:

假设我有一个从 MySQL 表中读取数据、对其进行操作并返回一些 data.frame 的函数。请注意,该函数只是一个示例,其功能本身并不重要...,例如:

addRowSd <- function(table,con,pattern="^Variable") {

dframe <- dbReadTable(con,table)
cn <- colnames(dframe)
qs <- subset(x, x  %in% grep(pattern, x, value=TRUE))
dframe$qsd <- sd(t(dframe[,c(qs)])) 

return(dframe)
}

mydf$sd <- addRowSd(...)

我最终得到了一个名为 mydf 的 data.frame。现在我想对 SQL 表名的字符向量执行此操作,并相应地命名返回的数据帧。如果我只是使用

x=lapply(MySQLtablenames,addRowSd,con)

我会得到一些名为 x 的列表。当然,我可以按照自己的方式取消列出和重命名所有内容,但我的问题是:

如何使 lapply(或其他类似函数)返回多个单个数据帧或至少一个包含从我的字符向量“MySQLtablenames”派生的一些名称的列表?

【问题讨论】:

  • 可能有助于使 addRowSd 函数为返回的 data.frame 分配一些名称...
  • names(x) &lt;- MySQLtablenames 或一行x&lt;-setNames(lapply(MySQLtablenames,addRowSd,con),MySQLtablenames)x&lt;-lapply(setNames(MySQLtablenames,MySQLtablenames),addRowSd,con) 怎么样

标签: r lapply


【解决方案1】:

我自己找到了答案:

assign("somename",dframe,envir = .GlobalEnv)

【讨论】:

  • 您可能会遇到范围界定问题。例如,如果你想在另一个函数中使用函数,那么你的 data.frame 是在全局环境中创建的。您可以使用parent.frame 来改进您的方法。
  • 在您的两个示例中,您都将 DF 插入到列表中(或 lapply 返回列表)。在那些情况下,作为 DF 的对象的名称是无关紧要的,不是吗。重要的是列表组件的names。如果我这样做,我会将 DF 存储在一个列表中,根据上面 Marek 的评论,在表名之后设置列表中的名称,然后使用该列表。如果您想按名称引用单个 DF,请使用 with(x, DF.name),其中 x 是由 lapply 返回的列表,DF.name 是您要访问的 DF 的名称或应用到它的某些函数的名称。跨度>
  • @Marek,目前唯一遇到范围界定问题的是我的大脑。 parent.frame 的东西对我来说是全新的,我还没有得到它,但谢谢你指向它。什么会导致范围界定问题?将大量数据从数据库加载到同一个(全局)环境?
  • 4 年多后,我只是添加...不要这样做。它也不会通过 CRAN 检查。
【解决方案2】:

如果您提供 sapply 一个字符向量,它将通过提供的字符向量命名返回列表中的项目(USE.NAMES 默认为 TRUE)...我也会根据 data.frames 使用 simple=FALSE返回你可能会得到不可预知的结果

x=sapply(MySQLtablenames,addRowSd,con, simplify=FALSE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2014-06-14
    • 2019-01-03
    相关资源
    最近更新 更多