将列表单个元素的列表强制转换为向量类型
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)))]
我正在使用 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)))]