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

时间:2015-11-17 01:21:32

标签: r list sorting coerce

我使用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))]

即,我没有在我正在使用的其他元素的上下文中订购每个元素。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我无法在CRAN中找到permn-package。我无法在包中找到permn函数:烫发,所以我无法重现你的结果。

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

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