/ / Połącz / scal listy według nazw elementów (lista na liście na liście) - r, lista, scal

Połącz / scal listy według nazw elementów (lista w liście na liście) - r, lista, scalanie

Mam jedną listę, która składa się z dwóch kolejnych list, których elementy częściowo pokrywają się z nazwami, które muszę połączyć / połączyć w jedną listę, element po elemencie.

W Połącz / scal listy według nazw elementów (lista na liście) dostarcza się rozwiązania, jak rozwiązać ten problem, jeśli dwie listy są oddzielnymi obiektami, tj. nie są zagnieżdżone (ponownie) na jednej liście.

Oto przykład tego przykładu

# Generate some toy data
library(digest)
l.1 <- rep(list(list(c(10,20), NULL),
list(c(10,20,30), NULL),
list(c(9,12,13), NULL)), 10000)
names(l.1) <- sapply(sample(1:30000, 30000, replace=FALSE), digest)
l.2 <- rep(list(list(NULL,c(1,0)),
list(NULL,c(1,2,3))), 10000)
names(l.2) <- c(names(l.1)[1:10000], sapply(sample(30001:40000, 10000, replace=FALSE), digest))


# Apply the solution posted at
# https://stackoverflow.com/questions/23483421/combine-merge-lists-by-elements-names-list-in-list
keys <- unique(c(names(l.1), names(l.2)))
l  <- setNames(lapply(keys, function(key) {
l1 <- l.1[[key]]
l2 <- l.2[[key]]
len <- max(length(l1), length(l2))
lapply(seq(len), function(i) c(l1[[i]], l2[[i]]))
}), keys)

Jak stwierdzono powyżej, rozwiązanie to jest wygodne, gdy liczba oddzielnych list (tutaj 2) jest mała.

Scenariusz, w którym te listy są zagnieżdżone wewnątrzjedna lista jest bardziej realistyczna. W ten sposób można byłoby wykonać operację dla wszystkich zagnieżdżonych list. Nie ma znaczenia, czy są 2 zagnieżdżone listy, czy 300.

Przykładem może być:

l.new <- list(l.1, l.2)

Aby zmodyfikować powyższe rozwiązanie, wiem, że pierwsza linia musi zostać zmieniona na:

keys <- unique(unlist(lapply(l.new, names)))

Jednak nie wiem, jak dostosować drugą linię

l  <- setNames(lapply(keys, function(key) {
l1 <- l.1[[key]]
l2 <- l.2[[key]]
len <- max(length(l1), length(l2))
lapply(seq(len), function(i) c(l1[[i]], l2[[i]]))
}),
keys)

Doceniam każdą pomoc.

Odpowiedzi:

2 dla odpowiedzi № 1

Musisz tylko użyć lapply jeszcze dwa razy z funkcjami zdefiniowanymi przez użytkownika:

keys <- unique(unlist(lapply(l.new, names)))
l2  <- setNames(lapply(keys, function(key) {
len <- max(unlist(lapply(l.new, function(x) length(x[[key]]))))
lapply(seq(len), function(i) unlist(lapply(l.new, function(x) x[[key]][[i]])))
}), keys)
all.equal(l, l2)
# [1] TRUE