Как привязать data.frames к третьему уровню именованных списков? - PullRequest
0 голосов
/ 21 марта 2020

Список "l_start" на уровне 1 - это именованный список, который сам по себе вмещает именованные списки ("l1", "l1a") на уровне 2, в свою очередь содержащий 2-3 кадра данных (a, b и, возможно, c). ) на уровне 3.

Цель состоит в том, чтобы привязать фреймы данных на уровне 3 на основе имен, если они доступны, чтобы получить "l_fini sh" (предпочтительнее использовать решение для data.table & rlist, но мурлыкать или основывать также хорошо)

# Level 2
l1 <- 
  # Level 3
  list(a = data.frame(matrix(1:4, ncol=2)),
       b = data.frame(matrix(1:4, ncol=2)),
       c= data.frame(matrix(1:4, ncol=2)))

# Level 2
l1a <- 
  # Level 3
  list(a = data.frame(matrix(1:6, ncol=2)),
       b = data.frame(matrix(1:6, ncol=2)))


# Level 1 "l_start"
l_start <- 
  list(l1, l1a)
names(l_start) <- c("l1", "l1a")

Как должен выглядеть "l_fini sh"

l_finish <- 
  list(l1_1a = list(a = rbind(l1$a, l1a$a),
                 b = rbind(l1$b, l1a$b)))

Надеясь на конечный продукт "l_fini sh" Обратите внимание, что c отброшено, потому что не в обоих списках

l_finish
#> $l1_1a
#> $l1_1a$a
#>   X1 X2
#> 1  1  3
#> 2  2  4
#> 3  1  4
#> 4  2  5
#> 5  3  6
#> 
#> $l1_1a$b
#>   X1 X2
#> 1  1  3
#> 2  2  4
#> 3  1  4
#> 4  2  5
#> 5  3  6

Закрыть, но не смог попасть туда с этими

Rbind происходит на один уровень выше моего примера rbind dataframes через вложенные списки

Только одно имя df в списке, не несколько rbind data.frames в списке в R

1 Ответ

1 голос
/ 21 марта 2020

A purrr решение:

library(purrr)
cols <- intersect(names(l_start[[1]]), names(l_start[[2]]))

map(l_start, `[`, cols) %>% transpose() %>% map(bind_rows)

#$a
#  X1 X2
#1  1  3
#2  2  4
#3  1  4
#4  2  5
#5  3  6

#$b
#  X1 X2
#1  1  3
#2  2  4
#3  1  4
#4  2  5
#5  3  6

Мы выбираем общие имена в списке, используя intersect, transpose их и связываем строки.

...