2016-03-24 17 views
5

Ho un semplice problema, ma non riesco a trovare una risposta semplice per questo. Ho il seguente tipo di elencoRiordina elementi elenco

my.list=list(a=c(1,2,3),random=1,list=matrix(1:10,nrow=2)) 

cui desidero cambiare l'ordine degli elementi della lista (qui: 'una', 'Lista' 'casuale' e) secondo l'ordine di un altro elenco (' a', 'lista', 'random'), o in tal modo un vettore di nomi delle liste: i nomi (my.other.list):

my.other.list=list(a=c(4,5,6),list=matrix(101:110,nrow=2),random=2) 

quindi l'obiettivo è quello di ottenere questa lista:

my.wanted.list=list(a=c(1,2,3),list=matrix(1:10,nrow=2),random=1) 

Si noti che entrambe le liste (my.list e my.other.list) hanno gli stessi nomi di lista, un e che questi non possono essere ordinati alfabeticamente o così.

Ho creato questo ciclo:

my.wanted.list=list() 
for(i in 1:length(my.list)){ 
    my.wanted.list[[i]]=my.list[[names(my.other.list)[i]]] 
} 
names(my.wanted.list)=names(my.other.list) 

Ma che sembra come un tempo soluzione per una problema apparentemente semplice. Soprattutto se le liste sono più grandi. Quindi c'è un modo più semplice per farlo?

Grazie.

+5

cosa dire 'my.list [nomi (my.other.list)]'? –

risposta

10

Si potrebbe semplicemente farlo utilizzando il meccanismo di subsetting della lista con i nomi.

my.list=list(a=c(1,2,3),random=1,list=matrix(1:10,nrow=2)) 

my.other.list=list(a=c(4,5,6),list=matrix(101:110,nrow=2),random=2) 

senza pakage

my.list[names(my.other.list)] 
#> $a 
#> [1] 1 2 3 
#> 
#> $list 
#>  [,1] [,2] [,3] [,4] [,5] 
#> [1,] 1 3 5 7 9 
#> [2,] 2 4 6 8 10 
#> 
#> $random 
#> [1] 1 

o si potrebbe utilizzare un pacchetto come rlist

my.list %>% 
    list.subset(names(my.other.list)) 
#> $a 
#> [1] 1 2 3 
#> 
#> $list 
#>  [,1] [,2] [,3] [,4] [,5] 
#> [1,] 1 3 5 7 9 
#> [2,] 2 4 6 8 10 
#> 
#> $random 
#> [1] 1 

si reoder il tuo primo elenco nell'ordine del vettore nome utilizzato per sottoinsiemi.

Problemi correlati