0

我正在使用 CRAN 包组合中的 permn 函数来生成一个列表列表,该列表由一系列数字的所有排列组成,如下所示

x <- str(permn(3))
x

List of 6
$ : int [1:3] 1 2 3
$ : int [1:3] 1 3 2
$ : int [1:3] 3 1 2
$ : int [1:3] 3 2 1
$ : int [1:3] 2 3 1
$ : int [1:3] 2 1 3

我也有

typeof(x[[1]])
"integer"

我的目标是按数字升序对这个列表列表进行排序(每个元素都需要被视为一个三位数字),而以下工作正常

permn(3)->x
x[order(sapply(x,'[[',1))]
[[1]]
[1] 1 2 3

[[2]]
[1] 1 3 2
...

任何 permn(n) n>3 都会产生错误的排序。我意识到我的问题是我正在对单个值而不是 n 位数字进行排序,但我不知道如何正确分解、排序和重组。我试过了

function(n){
out <-list()
permn(n)->list.of.lists
for(i in 1:length(list.of.lists)){
out[[length(out)+1]] <- unlist(list.of.lists[i])
}
out

但它给出了相同的结果

x[order(sapply(x,'[[',1))]

也就是说,我没有在我正在使用的其他元素的上下文中对每个元素进行排序。

有什么建议么?

4

1 回答 1

2

我无法在 CRAN 中找到 permn-package。而且我无法permn在 package:perm 中找到函数,因此无法重现您的结果。

如果x是一个列表,那么x[1]也将是一个列表,所以你的努力并typeof(x[1])没有告诉你第一个元素是什么。typeof(x[[1]]如果您想查看第一个子列表中的内容,您应该使用x. 输出显示print它是一个整数向量列表。如果您想要排序的向量列表,请使用:

 lapply( x, sort)

使用的建议sapply将返回一个矩阵。我假设您permn只是用来创建一个示例,因为据我了解您的要求,它将产生与rep(list(1,2,3), 6).

如果您希望将这些 paste()-d 一起作为排序/排序操作的基础,请使用:

x[ order( sapply(x, paste0, collapse=".")) ]

或者,更有效地避免类型强制(虽然更冗长)

x[order(vapply(x, function(y) sum(y * 10^((length(y)-1L):0)), numeric(1)))]

或者先把乘数拉出来,

mult <- 10^((length(x[[1]])-1L):0)
x[order(vapply(x, function(y) sum(y * mult), numeric(1)))]
于 2015-11-17T01:44:15.627 回答