Получение пути ко всем объектам класса data.frame в файлах rData - PullRequest
1 голос
/ 10 июля 2020

У меня есть несколько файлов .rData, глобальные переменные среды которых верхнего уровня представляют собой смесь data.frames, списков, глубоко вложенных списков. Я знаю, что многие из вложенных списков имеют в себе типы data.frame, но у меня возникают проблемы с получением пути к ним.

Раньше я сталкивался с подобной проблемой с другим типом класса, используя следующий code

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

и, хотя это не самое элегантное решение, оно быстро и добилось того, что мне нужно. возвращает имена вроде «Fluor.Spe c .WA.M12.S C .13», что затем позволяет мне манипулировать объектом после формирования '.' в '$'.

Может ли кто-нибудь помочь мне получить путь ко всем типам классов data.frame, вложенных или иным образом в сильно изменяемые файлы .rData? Заранее спасибо

1 Ответ

1 голос
/ 17 июля 2020

Если вы хотите вернуть все 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 (как это делает base rapply), а how = "flatten" вернет собранные data.frames в виде уплощенного списка.

NB: если вы хотите вернуть полные пути объектов к найденным 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

Изменить: Чтобы также возвращать data.frames, присутствующие в слотах некоторого класса S4, возможный способ расширения вышеуказанного вызова:

## 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

В этом case, classes = c("data.frame", "user") проверит data.frames и S4-объекты класса "user". Функция f, примененная к объекту, возвращает сам объект, если это data.frame, или слот "df", если это S4-объект.

Обратите внимание, что этот код предполагает, что S4- известно имя класса, а также слоты, содержащие объекты data.frame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...