如何在Base R中按升序对多个列表(而不是其元素)进行重新排序

时间:2019-01-29 20:12:35

标签: r list function loops sorting

我想知道如何以增加的方式对3个不同的列表(即,列表彼此不共享任何元素)进行重新排序?

例如,在下面的输出中,我希望整个第二个列表占据第一个列表的位置,第三个列表占据第二个列表的位置,依此类推。

PS 。我的目标是实现一种功能/循环结构,以对任意数量的列表进行重新排序。

x = list(20:46, 3:7, 6:9)
x[-1] <- Map(setdiff, x[-1], x[-length(x)])
x

# output:

[[1]]    ## FIRST LIST
 [1] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

[[2]]    ## SECOND LIST
 [1] 3 4 5 6 7

[[3]]   ## THIRD LIST
 [1] 8 9

2 个答案:

答案 0 :(得分:1)

去那里:

reorder <- function(x){
 mins <- sapply(x, min) 
 aux=list()
 i=1
 while (length(mins)>0) {
   aux[[i]] <- x[[which.min(mins)]]
   x <- x[-which.min(mins)]
   mins <- mins[-which.min(mins)]
   i=i+1
 }
return(aux)
}

该函数将根据其向量的最少数量重新排列列表。

例如:

x <- reorder(x)

将获得您想要的输出

答案 1 :(得分:0)

这些列表是否总是这样?我的意思是...就像一个序列吗?

对于这种特殊情况,您只需要每个列表中的代表号码,然后可以按如下顺序进行排列:

x = list(20:46, 3:7, 6:9)
x[-1] <- Map(setdiff, x[-1], x[-length(x)])
x

require(dplyr)
sapply(x, max) %>% order %>% x[.]

[[1]]
[1] 3 4 5 6 7

[[2]]
[1] 8 9

[[3]]
 [1] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

您正在寻找什么吗?