2016-03-24 20 views
5

Tôi gặp sự cố đơn giản nhưng không thể tìm thấy câu trả lời đơn giản cho nó. Tôi có các loại sau đây của danh sáchSắp xếp lại các yếu tố danh sách

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

trong đó tôi muốn thay đổi thứ tự của các yếu tố danh sách (ở đây: 'a', 'danh sách' 'ngẫu nhiên' và) theo thứ tự của danh sách khác (' a', 'danh sách', 'ngẫu nhiên'), hoặc do một vector của tên danh sách: tên (my.other.list):

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

nên mục tiêu là để có được danh sách này:

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

Lưu ý rằng cả hai danh sách (my.list và my.other.list) đều có cùng tên danh sách, nd rằng những không thể được sắp xếp theo thứ tự bảng chữ cái hoặc như vậy.

Tôi tạo ra vòng lặp này:

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) 

Nhưng điều đó có vẻ như một giải pháp tiêu thụ cho một vấn đề dường như đơn giản thời gian. Đặc biệt nếu các danh sách lớn hơn. Vì vậy, có một cách đơn giản hơn để làm điều này?

Cảm ơn bạn.

+5

còn về 'my.list [tên (my.other.list)]'? –

Trả lời

10

Bạn có thể thực hiện việc này đơn giản bằng cách sử dụng cơ chế đặt danh sách có tên.

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) 

mà không cần bất kỳ 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 

hoặc bạn có thể sử dụng một gói phần mềm như 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 

nó reoder danh sách đầu tiên của bạn trong thứ tự của các vector tên bạn sử dụng cho Subsetting.

Các vấn đề liên quan