Как связать строки данных в отдельных элементах списка списков - PullRequest
1 голос
/ 20 апреля 2019

Предположим, у меня есть список списков следующим образом:

set.seed(111)
lst_1 = rep(list(list()), 3) 

lst_1[[1]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[2]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[3]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))

, где каждый элемент списка (1, 2 и 3) является списком, который содержит два элемента данных.

Как я могу последовательно связать строки первого data.frame в каждом (под) списке?то есть lst_1[[1]][[1]] + lst_1[[2]][[1]] + lst_1[[3]][[1]], и в конечном итоге сделать то же самое для второго data.frame?

Вот мой желаемый результат, который достигается вручную с помощью цикла for, однако мой реальный списоксписков гораздо больше:

lst_out = rep(list(list()), 2) 

for (i in 1:2) {
lst_out[[i]] = rbind(lst_1[[1]][[i]], lst_1[[2]][[i]], lst_1[[3]][[i]])
}

Ответы [ 3 ]

3 голосов
/ 20 апреля 2019

Если я правильно интерпретирую, базовое решение R должно быть довольно простым. Map функция rbind для каждой части 3 входов в lst_1:

do.call(Map, c(rbind, lst_1))

Это слегка скрытый способ вызова расширенной строки Map:

Map(rbind, lst_1[[1]], lst_1[[2]], lst_1[[3]])

, который начинает выглядеть очень похоже на ваш исходный цикл for, и дает тот же результат, что и при использовании do.call:

identical(
  do.call(Map, c(rbind, lst_1)),
  Map(rbind, lst_1[[1]], lst_1[[2]], lst_1[[3]])
)
#[1] TRUE

Проверяет с намеченным результатом тоже:

identical(lst_out, do.call(Map, c(rbind, lst_1)))
#[1] TRUE
2 голосов
/ 20 апреля 2019

Я думаю, что самый простой способ - просто purrr::transpose список, чтобы вместо трех подсписков с двумя элементами фрейма данных у вас было два подсписка с тремя элементами фрейма данных.Это означает, что все кадры данных для привязки находятся в одном и том же подсписке, поэтому итерация намного проще, и мы можем map по основному списку.Смотрите ниже, отметив, что вы можете просто загрузить purrr, так как dplyr::bind_rows немного быстрее, а tibble::glimpse только для печати. ​​

library(tidyverse)
set.seed(111)
lst_1 = rep(list(list()), 3) 

lst_1[[1]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[2]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[3]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))

lst_1 %>%
  transpose %>%
  map(bind_rows) %>%
  glimpse
#> List of 2
#>  $ :'data.frame':    15 obs. of  1 variable:
#>   ..$ rnorm.5.: num [1:15] 0.235 -0.331 -0.312 -2.302 -0.171 ...
#>  $ :'data.frame':    15 obs. of  1 variable:
#>   ..$ rnorm.5.: num [1:15] 0.14 -1.497 -1.01 -0.948 -0.494 ...

Создано в 2019-04-20 с помощью представительный пакет (v0.2.1)

1 голос
/ 20 апреля 2019

раствор Base R

set.seed(111)
lst_1 <- rep(list(list()), 3) 

lst_1[[1]] <- list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[2]] <- list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[3]] <- list(data.frame(rnorm(5)), data.frame(rnorm(5)))

lst_out_2 <- list()

for (i in 1:2) { 
  lst_out_2[[i]] <- do.call('rbind', sapply(lst_1, `[`, i))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...