【问题标题】:Reorder list elements重新排序列表元素
【发布时间】:2016-03-24 19:51:12
【问题描述】:

我有一个简单的问题,但找不到直接的答案。我有以下类型的列表

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

我想根据另一个列表('a','list','random')的顺序更改列表元素的顺序(这里:'a','random'和'list') ,或者因此是列表名称的向量:names(my.other.list):

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

所以目标是获取这个列表:

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

请注意,两个列表(my.list 和 my.other.list)具有相同的列表名称,并且它们不能按字母顺序排序。

我创建了这个循环:

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)

但是对于一个看似简单的问题,这似乎是一个耗时的解决方案。特别是如果列表更大。那么有没有更简单的方法呢?

谢谢。

【问题讨论】:

  • my.list[names(my.other.list)] 呢?

标签: r list


【解决方案1】:

您可以简单地使用带有名称的列表的子集机制来做到这一点。

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

或者你可以使用一个包作为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

它按照您用于子集化的名称向量的顺序重新编码您的第一个列表。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2012-12-12
    • 2023-01-27
    • 2016-01-20
    相关资源
    最近更新 更多