Подтвердить что ты не робот

Объединение элементов списка списков по индексу

Рассмотрим следующий список списков:

lst = list(list(c(1,2), c(3,4)),list(c(5,6), c(7,8)),list(c(9,10), c(11,12)))

Список lst содержит три списка, каждый из которых содержит два вектора в качестве элементов. Я хотел бы объединить элементы базовых списков по индексу. Другими словами, я хотел бы объединить вектор 1 из списка 1 с списком 2 и списком 3, а вектор 2 из списка 1 - с списком 2 и списком 3 и т.д....

Это результат, который я хочу достичь:

res = list(c(1,2,5,6,9,10), c(3,4,7,8,11,12))

Я знаю, что это может быть достигнуто следующим образом в случае двух отдельных списков:

mapply(c, lst1, lst2)

Однако я не уверен, как реплицировать ту же логику, используя список списков.

Любой эффективный способ добиться этого? Имейте в виду, что в действительности lst - это список из 5000 списков, и каждый базовый список содержит большое количество векторов.

Спасибо!

4b9b3361

Ответ 1

Вы можете сделать:

do.call(Map, c(c, lst))

Ответ 2

Вы на правильном пути:

do.call(function(...) mapply(c,...,SIMPLIFY = FALSE),args = lst)
[[1]]
[1]  1  2  5  6  9 10

[[2]]
[1]  3  4  7  8 11 12

Ответ 3

Я искал что-то по линии вопроса OP... но со списком кадров данных вместо векторов. В этом случае слегка модифицирующий ответ @joran выше дает желаемый результат. Рассмотрим:

mylist <- 
  lapply(1:2, function(y){
    df1 <- data.frame(a=y, b=y^2, c=y^3)
    df2 <- data.frame(d=y, e=y+1)
    return(list(df1=df1, df2=df2))
    }) 

Затем вы можете повторно объединить элементы подписок в отдельные кадры данных на основе их общих индексов:

library(dplyr)
mylist2 <- do.call(function(...) mapply(bind_rows, ..., SIMPLIFY=F), args = mylist)