r list merge element named

Combinar/fusionar listas por nombre de elementos



merge named (2)

Tengo dos listas, cuyos elementos tienen nombres parcialmente superpuestos, que necesito fusionar / combinar en una sola lista, elemento por elemento

> lst1 <- list(integers=c(1:7), letters=letters[1:5], words=c("two", "strings")) > lst2 <- list(letters=letters[1:10], booleans=c(TRUE, TRUE, FALSE, TRUE), words=c("another", "two"), floats=c(1.2, 2.4, 3.8, 5.6)) > lst1 $integers [1] 1 2 3 4 5 6 7 $letters [1] "a" "b" "c" "d" "e" $words [1] "two" "strings" > lst2 $letters [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" $booleans [1] TRUE TRUE FALSE TRUE $words [1] "another" "two" $floats [1] 1.2 2.4 3.8 5.6

Intenté usar mapply , que básicamente combina las dos listas por índice (es decir, "[["), mientras que necesito combinarlas por nombre (es decir: "$"). Además, dado que las listas tienen diferentes longitudes, se aplica la regla de reciclaje (con resultados bastante impredecibles).

> mapply(c, lst1, lst2) $integers [1] "1" "2" "3" "4" "5" "6" "7" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" $letters [1] "a" "b" "c" "d" "e" "TRUE" "TRUE" "FALSE" "TRUE" $words [1] "two" "strings" "another" "two" $<NA> [1] 1.0 2.0 3.0 4.0 5.0 6.0 7.0 1.2 2.4 3.8 5.6 Warning message: In mapply(c, lst1, lst2) : longer argument not a multiple of length of shorter

Como puedes imaginar, lo que busco es:

$integers [1] 1 2 3 4 5 6 7 $letters [1] "a" "b" "c" "d" "e" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" $words [1] "two" "strings" "another" "two" $booleans [1] TRUE TRUE FALSE TRUE $floats [1] 1.2 2.4 3.8 5.6

¿Hay alguna manera de lograr eso? ¡Gracias!


También uso grep , ¡no sé si es mejor, peor o equivalente!

l_tmp <- c(lst1, lst2, lst1) keys = unique(names(l_tmp)) l = sapply(keys, function(name) {unlist(l_tmp[grep(name, names(l_tmp))])})


Tu puedes hacer:

keys <- unique(c(names(lst1), names(lst2))) setNames(mapply(c, lst1[keys], lst2[keys]), keys)

La generalización a cualquier número de listas requeriría una combinación de do.call y lapply :

l <- list(lst1, lst2, lst1) keys <- unique(unlist(lapply(l, names))) setNames(do.call(mapply, c(FUN=c, lapply(l, `[`, keys))), keys)