【问题标题】:Coercing List of List Individual Elements to Vector Type将列表单个元素的列表强制转换为向量类型
【发布时间】:2015-11-17 01:21:32
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

    标签: r list sorting coerce


    【解决方案1】:

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

    如果x 是一个列表,那么x[1] 也将是一个列表,因此您对typeof(x[1]) 的努力并没有告诉您第一个元素是什么。如果您想查看x 的第一个子列表中的内容,您应该使用typeof(x[[1]]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)))]
    

    【讨论】:

    • 帖子已编辑。我的 R 天真有点……这个解决方案效果很好。比我循环每个元素的非 R 方式要好得多。
    • @TheTime。我不确定类型强制是否一定效率较低。十进制展开法需要做算术运算。当然,这是一个可测试的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多