检索rData文件中所有data.frame类对象的路径

时间:2020-07-10 13:27:43

标签: r dataframe recursion

我有多个.rData文件,这些文件的顶级全局环境变量是data.frame,列表,深层嵌套列表的混合。我知道许多嵌套列表中都有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文件中?预先感谢

1 个答案:

答案 0 :(得分:1)

如果要返回全局环境中加载的所有data.frames,它们作为单个对象或作为嵌套列表的元素出现,请在rrapply包中使用rrapply(扩展名base 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", dfaslist = FALSE)
#> $w
#>   X1
#> 1  1
#> 
#> $df
#>   a b
#> 1 1 2

在这里,dfaslist = FALSE将不会递归到data.frame列中(就像基础rapply那样),而how = "flatten"将把收集到的data.frames作为扁平化列表返回。

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

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

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

## 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", dfaslist = FALSE)
#> $v
#>   user
#> 1    1
#> 
#> $w
#>   X1
#> 1  1
#> 
#> $df
#>   a b
#> 1 1 2

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

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

相关问题