2012-05-27 24 views
33

Non so come creare elenchi di elenchi in R. Ho diversi elenchi, voglio memorizzarli in una struttura dati per facilitare l'accesso a . Tuttavia, sembra che tu non possa usare la lista di liste in R, quindi se ottengo la lista l1 da un'altra lista, diciamo, l2 allora non posso accedere agli elementi l1. Come posso implementarlo?R. come creare un elenco di elenchi in R?

EDIT vi mostrerò su esempio ciò che non funziona per me:

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 

ma a dovrebbe essere una lista!

risposta

37

Si può facilmente fare liste di liste

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

mylist ora è una lista che contiene due elenchi. Per accedere a list1 è possibile utilizzare mylist[[1]]. Se si vuole essere in grado di qualcosa di simile mylist$list1 allora avete bisogno di fare somethingl come

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

Modifica: Per rispondere alla tua modifica. Basta usare staffa doppia indicizzazione

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

@capoluca di espandere la spiegazione di Dason, 'list_all [1]' non seleziona il primo _element_ di 'list_all'. Per gli elenchi, '[' recupera _sublists_ while' [['recupera _elementi_. – joran

+0

Se si crea una lista di liste duplicate come 'lista mia <- lista (lista1, lista1)', 'lista1' copiata o referenziata due volte? –

+0

Cosa succede se sto creando un elenco di liste in un ciclo e quindi non ho le singole sotto-liste calcolate e memorizzate in variabili. Piuttosto, desidero aggiungerli alla lista degli elenchi uno per uno mentre li computo. – Leonid

5

Usando il tuo esempio ::

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

Usa '[[' per recuperare un elemento di una lista:

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

[[2]] 
[1] 2 

class(b) 
[1] "list" 
1

Se si sta cercando di mantenere una lista di liste (simile a list.append di pitone()) che questo potrebbe funzionare:

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

Come altre risposte hanno sottolineato in già un modo più complicato, hai fatto già crea una lista di liste! È solo la strana uscita di R che confonde (tutti?). Prova questo:

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

E la cosa più semplice costruzione sarebbe questo:

> 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"