我有一个简单的问题,但无法找到一个直截了当的答案.我有以下类型的列表
my.list=list(a=c(1,2,3),random=1,list=matrix(1:10,nrow=2))
Run Code Online (Sandbox Code Playgroud)
其中我想根据另一个列表('a','list','random')的顺序改变列表元素的顺序(这里:'a','random'和'list'),或者因此列表名称的向量:名称(my.other.list):
my.other.list=list(a=c(4,5,6),list=matrix(101:110,nrow=2),random=2)
Run Code Online (Sandbox Code Playgroud)
所以目标是获得这个清单:
my.wanted.list=list(a=c(1,2,3),list=matrix(1:10,nrow=2),random=1)
Run Code Online (Sandbox Code Playgroud)
请注意,列表(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)
Run Code Online (Sandbox Code Playgroud)
但对于一个看似简单的问题,这似乎是一个耗时的解决方案.特别是如果列表更大.那么有更简单的方法吗?
谢谢.
cde*_*erv 14
您可以使用带有名称的列表的子集化机制来执行此操作.
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)
Run Code Online (Sandbox Code Playgroud)
没有任何包裹
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
Run Code Online (Sandbox Code Playgroud)
或者您可以使用包裹作为 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
Run Code Online (Sandbox Code Playgroud)
它按照用于子集化的名称向量的顺序重新排列第一个列表.
| 归档时间: |
|
| 查看次数: |
7688 次 |
| 最近记录: |