Как извлечь все списки из списка в r? - PullRequest
0 голосов
/ 10 апреля 2020

Было много близких решений, но, к сожалению, я не мог найти правильное. У меня есть список списков, как показано ниже. Как вы можете видеть, есть 3 подсписка (01-2011, 02-2011 и 01-2012) в их списке. Но я хочу получить только списки с именами (01-2011,02-2011 and 01-2012)

Вот мои данные и их структура;

data<-list(structure(list(`01-2011` = structure(list(dmax = structure(list(
    m5 = 0.266, m10 = 0.532, m15 = 0.797, m30 = 1.092), .Names = c("m5", 
"m10", "m15", "m30"))), .Names = "dmax"), `01-2012` = structure(list(
    dmax = structure(list(m5 = 1.224, m10 = 2.395, m15 = 3.063, 
        m30 = 5.131), .Names = c("m5", "m10", "m15", "m30"))), .Names = "dmax")), .Names = c("01-2011", 
"01-2012")), structure(list(`02-2011` = structure(list(dmax = structure(list(
    m5 = 0.955, m10 = 1.683, m15 = 2.398, m30 = 4.539), .Names = c("m5", 
"m10", "m15", "m30"))), .Names = "dmax")), .Names = "02-2011"))


[[1]]
[[1]]$`01-2011`
[[1]]$`01-2011`$dmax
[[1]]$`01-2011`$dmax$m5
[1] 0.266

[[1]]$`01-2011`$dmax$m10
[1] 0.532

[[1]]$`01-2011`$dmax$m15
[1] 0.797

[[1]]$`01-2011`$dmax$m30
[1] 1.092



[[1]]$`01-2012`
[[1]]$`01-2012`$dmax
[[1]]$`01-2012`$dmax$m5
[1] 1.224

[[1]]$`01-2012`$dmax$m10
[1] 2.395

[[1]]$`01-2012`$dmax$m15
[1] 3.063

[[1]]$`01-2012`$dmax$m30
[1] 5.131




[[2]]
[[2]]$`02-2011`
[[2]]$`02-2011`$dmax
[[2]]$`02-2011`$dmax$m5
[1] 0.955

[[2]]$`02-2011`$dmax$m10
[1] 1.683

[[2]]$`02-2011`$dmax$m15
[1] 2.398

[[2]]$`02-2011`$dmax$m30
[1] 4.539

Я попытался lapply(data, "[["), но это дало ошибку.

Вот желаемый вывод;

out<-structure(list(`01-2011` = structure(list(dmax = structure(list(
    m5 = 0.266, m10 = 0.532, m15 = 0.797, m30 = 1.092), .Names = c("m5", 
"m10", "m15", "m30"))), .Names = "dmax"), `01-2012` = structure(list(
    dmax = structure(list(m5 = 1.224, m10 = 2.395, m15 = 3.063, 
        m30 = 5.131), .Names = c("m5", "m10", "m15", "m30"))), .Names = "dmax"), 
    `02-2011` = structure(list(dmax = structure(list(m5 = 0.955, 
        m10 = 1.683, m15 = 2.398, m30 = 4.539), .Names = c("m5", 
    "m10", "m15", "m30"))), .Names = "dmax")), .Names = c("01-2011", 
"01-2012", "02-2011"))



$`01-2011`
$`01-2011`$dmax
$`01-2011`$dmax$m5
[1] 0.266

$`01-2011`$dmax$m10
[1] 0.532

$`01-2011`$dmax$m15
[1] 0.797

$`01-2011`$dmax$m30
[1] 1.092



$`01-2012`
$`01-2012`$dmax
$`01-2012`$dmax$m5
[1] 1.224

$`01-2012`$dmax$m10
[1] 2.395

$`01-2012`$dmax$m15
[1] 3.063

$`01-2012`$dmax$m30
[1] 5.131



$`02-2011`
$`02-2011`$dmax
$`02-2011`$dmax$m5
[1] 0.955

$`02-2011`$dmax$m10
[1] 1.683

$`02-2011`$dmax$m15
[1] 2.398

$`02-2011`$dmax$m30
[1] 4.539

Ответы [ 2 ]

4 голосов
/ 10 апреля 2020

Вы можете просто unlist с recursive = FALSE:

res <- unlist(data, recursive = FALSE)

Проверка выходов:

all.equal(out, res)

# [1] TRUE
0 голосов
/ 10 апреля 2020

Мы также можем использовать flatten

library(purrr)
res <- flatten(data)
identical(out, res)
#[1] TRUE
...