2016-03-24 24 views
5

Basit bir sorunum var, ancak bunun için doğrudan bir yanıt bulamıyor. '(Başka bir listenin sırasına göre: I ('A', 'rastgele' ve 'listesi' burada) listenin elemanları sırasını değiştirmek için istediğiniz listesindenListe öğelerini yeniden sıralama

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

aşağıdaki tip a', 'listesi', 'rastgele') ya da bu şekilde liste adları için bir vektör: adları (my.other.list):

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

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

böylece hedef, bu listeyi almak için bir

Her iki listenin (my.list ve my.other.list) aynı liste adlarına sahip olduğunu unutmayın. Bunlar alfabetik olarak sıralanamaz ya da öyle.

bu döngü oluşturdu:

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) 

Ama bu görünüşte basit sorununa çözüm tüketen bir zaman gibi görünüyor. Özellikle listeler daha büyükse. Yani bunu yapmanın daha basit bir yolu var mı?

Teşekkür ederiz.

+5

'my.list [names (my.other.list)]' nedir? –

cevap

10

Bunu, listenin alt değiştirme mekanizmasını kullanarak adlarını kullanarak yapabilirsiniz. herhangi pakage olmadan

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) 

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 

ya da bunu size subsetting için kullandığınız ad vektörü sırasına göre ilk listeyi reoder 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 

olarak bir paket kullanabilirsiniz.

İlgili konular