【问题标题】:Retrieving the path to all data.frame class objects in rData files检索 rData 文件中所有 data.frame 类对象的路径
【发布时间】:2020-10-31 06:10:37
【问题描述】:

我有多个 .rData 文件,其顶级全局环境变量是 data.frames、列表、深度嵌套列表的混合。我知道许多嵌套列表中都有 data.frame 类型,但我无法检索到它们的路径。

我之前在使用以下代码的另一种类型的课程中遇到过类似的问题

names(rapply(mget(ls(.GlobalEnv), envir=.GlobalEnv), length, classes="fluor.spectral.data", how="unlist"))

虽然不是最优雅的解决方案,但它很快就达到了我的需要。返回诸如“Fluor.Spec.WA.M12.SC.13”之类的名称,然后允许我在格式化“。”后操纵对象。进入'$'。

谁能帮我检索到所有 data.frame 类类型的路径,嵌套或以其他方式在高度可变的 .rData 文件中?提前致谢

【问题讨论】:

    标签: r dataframe recursion


    【解决方案1】:

    如果您想返回全局环境中加载的所有 data.frames,无论是作为单个对象还是作为嵌套列表的元素,请在 rrapply-package 中使用 rrapply(基础 rrapply 的扩展) .

    library(rrapply)
    
    w <- data.frame(1)
    x <- list(1, 2, 3)
    y <- 5
    z <- list(1, 2, list(1, df = data.frame(a = 1, b = 2)))
    
    rrapply(as.list(.GlobalEnv), classes = "data.frame", how = "flatten")
    #> $w
    #>   X1
    #> 1  1
    #> 
    #> $df
    #>   a b
    #> 1 1 2
    

    设置classes = "data.frame" 可避免递归到data.frame 列(就像基本rapply 一样),how = "flatten" 会将收集到的data.frames 作为扁平列表返回。

    注意:如果要返回找到的 data.frames 的完整对象路径,请设置 how = "prune" 而不是 how ="flatten"

    rrapply(as.list(.GlobalEnv), classes = "data.frame", how = "prune")
    #> $w
    #>   X1
    #> 1  1
    #> 
    #> $z
    #> $z[[1]]
    #> $z[[1]]$df
    #>   a b
    #> 1 1 2
    

    编辑:为了也返回存在于某些 S4 类插槽中的 data.frames,扩展上述调用的一种可能方法是:

    ## define S4-class with a data.frame in "df" slot
    userClass <- setClass("user", slots = c(df = "data.frame"))
    v <- userClass(df = data.frame(user = 1))
    
    rrapply(as.list(.GlobalEnv), 
                       classes = c("data.frame", "user"), 
                       f = function(x) {
                         if(class(x) == "user") {
                           slot(x, "df")
                         } else {
                           x
                         }
                       },
                       how = "flatten")
    #> $v
    #>   user
    #> 1    1
    #> 
    #> $w
    #>   X1
    #> 1  1
    #> 
    #> $df
    #>   a b
    #> 1 1 2
    

    在这种情况下,classes = c("data.frame", "user") 将检查 "user" 类的 data.frames 和 S4 对象。应用于对象的f 函数,如果它是一个data.frame,则返回对象本身;如果它是一个S4 对象,则返回"df" 槽。

    请注意,此代码假定 S4 类名称以及包含 data.frame 对象的插槽是已知的。

    【讨论】:

    • 感谢您为我指明了正确的方向。尽管该功能没有做我需要做的事情,但我想现在我明白了原因。我正在使用的嵌套数据包含一个我们在不同深度定义的特殊类。我认为 R 将这些称为 S4 对象。 data.frames 本身存在于这些对象中,并且可以像这样访问:“ownDefinedClass”@ 我认为 rrapply 不允许“渗透”它们并检索我需要的东西(至少我认为这是正在发生的事情")。您的代码确实检索了这些对象之外的 data.frames,谢谢!
    • 查看编辑后的响应以从 S4 类的给定插槽中提取 data.frames。对于上下文,rrapply 递归到嵌套列表(与基 rapply 相同),如果 S4 对象不属于 "list" 类,rrapply 将不会递归到它。
    • 太棒了!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2020-01-06
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多