/ Combinación / elementwise de dos listas en R - r, elementwise-operations

combinación de elementos de dos listas en R - r, operaciones por elementos

Oye, tengo dos listas:

list.a <- as.list(c("a", "b", "c"))

list.b <- as.list(c("d", "e", "f"))

Me gustaría combinar estas listas de forma recursiva, de modo que el resultado sea una lista de elementos combinados como un vector como el siguiente:

[[1]]
[1] a d

[[2]]
[1] a e

[[3]]
[1] a f

[[4]]
[1] b d

y así. Siento que me estoy perdiendo algo relativamente simple aquí. ¿Alguna ayuda?

Aclamaciones.

Respuestas

11 para la respuesta № 1

expand.grid(list.1, list.b) te da el resultado deseado en una data.frame estructura. Este suele ser el formato más útil para trabajar con datos en R. Sin embargo, puede obtener la estructura exacta que solicita (guardar el pedido) con una llamada a apply y lapply:

result.df <- expand.grid(list.a, list.b)
result.list <- lapply(apply(result.df, 1, identity), unlist)

Si desea que esta lista esté ordenada por el primer elemento:

result.list <- result.list[order(sapply(result.list, head, 1))]

5 para la respuesta № 2

Usted quiere mapply (Si por "recursivamente" quiere decir "en paralelo"):

mapply(c, list.a, list.b, SIMPLIFY=FALSE)

O tal vez esto es más lo que quieres:

unlist(lapply(list.a, function(a) lapply(list.b, function (b) c(a, b))), recursive=FALSE)

3 para la respuesta № 3

Esto te da lo que buscas:

unlist(lapply(list.a, function(X) {
lapply(list.b, function(Y) {
c(X, Y)
})
}), recursive=FALSE)

2 para la respuesta № 4

Aquí hay una función a la que puedes pasar listas para expandir.

expand.list <- function(...){
lapply(as.data.frame(t((expand.grid(...)))),c, recursive = TRUE, use.names = FALSE)}

expand.list(list.a, list.b)

1 para la respuesta № 5

Aquí hay un enfoque de fuerza bruta que, dado que son las mismas dimensiones, agregará list.b a list.a recursivamente usando la función de agregar.

# CREATE LIST OBJECTS
list.a <- as.list(c("a", "b", "c"))
list.b <- as.list(c("d", "e", "f"))

# CREATE AN EMPTY LIST TO POPULATE
list.ab <- list()

# DOUBLE LOOP TO CREATE RECURSIVE COMBINATIONS USING append
ct=0
for( i in 1:length(list.a) ) {
for (j in 1:length(list.b) ) {
ct=ct+1
list.ab[[ct]] <- append(list.a[[i]], list.b[[j]])
}
}

# PRINT RESULTS
list.ab

1 para la respuesta № 6

Sorprendido nadie ha mencionado este sencillo forro:

as.list(outer(list.a,list.b, paste))

[[1]]
[1] "a d"

[[2]]
[1] "b d"

[[3]]
[1] "c d"

[[4]]
[1] "a e"