将列表单个元素的列表强制转换为向量类型

Coercing List of List Individual Elements to Vector Type

我正在使用 CRAN 包 combinat 中的 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))]

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

有什么建议吗?

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

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

 lapply( x, sort)

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

如果你想将这些 paste()-d 一起作为 sort/order 操作的基础,那么使用:

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)))]