2012-05-27 29 views
33

No sé cómo hacer lista de listas en R. Tengo varias listas, quiero almacenarlos en una estructura de datos para hacer el acceso más fácil . Sin embargo, parece que no puedes usar la lista de listas en R, así que si obtengo la lista l1 de otra lista, por ejemplo, l2, entonces no puedo acceder a los elementos l1. ¿Cómo puedo implementarlo?R. cómo hacer una lista de listas en R?

EDITAR voy a mostrar en el ejemplo de lo que no funciona para mí:

list1 <- list() 
list1[1] = 1 
list1[2] = 2 
list2 <- list() 
list2[1] = 'a' 
list2[2] = 'b' 
list_all <- list(list1, list2) 
a = list_all[1] 
a[2] 
#[[1]] 
#NULL 

pero a debe ser una lista!

Respuesta

37

Usted puede hacer fácilmente listas de listas

list1 <- list(a = 2, b = 3) 
list2 <- list(c = "a", d = "b") 
mylist <- list(list1, list2) 

mylist ahora es una lista que contiene dos listas. Para acceder a list1 puede usar mylist[[1]]. Si usted quiere ser capaz de algo así como mylist$list1 entonces usted tiene que hacer somethingl como

mylist <- list(list1 = list1, list2 = list2) 
# Now you can do the following 
mylist$list1 

Editar: Para responder a su edición. Sólo tiene que utilizar el doble indexación soporte

a <- list_all[[1]] 
a[[1]] 
#[1] 1 
a[[2]] 
#[1] 2 
+3

@capoluca Para ampliar la explicación de Dason, 'list_all [1]' no selecciona la primera _element_ de 'list_all'. Para las listas, '[' recupera _sublists_ mientras '[[' recupera _elements_. – joran

+0

Si crea una lista de listas duplicadas como 'mylist <- list (list1, list1)', ¿'list1' se copia o se hace referencia dos veces? –

+0

¿Qué sucede si estoy creando una lista de listas en un bucle y, por lo tanto, no tengo las sublistas individuales calculadas y almacenadas en variables? Más bien, deseo agregarlos a la lista de listas una por una a medida que las calculo. – Leonid

5

Usando su ejemplo ::

list1 <- list() 
list1[1] = 1 
list1[2] = 2 
list2 <- list() 
list2[1] = 'a' 
list2[2] = 'b' 
list_all <- list(list1, list2) 

Uso '[[' para recuperar un elemento de una lista:

b = list_all[[1]] 
b 
[[1]] 
[1] 1 

[[2]] 
[1] 2 

class(b) 
[1] "list" 
1

Si usted está tratando de mantener una lista de listas (similares a list.append de pitón()) que esto podría funcionar:

a <- list(1,2,3) 
b <- list(4,5,6) 
c <- append(list(a), list(b)) 

> c 
[[1]] 
[[1]][[1]] 
[1] 1 

[[1]][[2]] 
[1] 2 

[[1]][[3]] 
[1] 3 


[[2]] 
[[2]][[1]] 
[1] 4 

[[2]][[2]] 
[1] 5 

[[2]][[3]] 
[1] 6 
0

Como otras respuestas señaladas en de una manera más complicada, ya hiciste ya ¡crea una lista de listas! Es solo la salida impar de R lo que confunde (¿todo el mundo?). Prueba esto:

> str(list_all) 
List of 2 
$ :List of 2 
    ..$ : num 1 
    ..$ : num 2 
$ :List of 2 
    ..$ : chr "a" 
    ..$ : chr "b" 

Y la construcción más sencilla sería la siguiente:

> str(list(list(1, 2), list("a", "b"))) 
List of 2 
$ :List of 2 
    ..$ : num 1 
    ..$ : num 2 
$ :List of 2 
    ..$ : chr "a" 
    ..$ : chr "b"