【问题标题】:Sorting a list of unequal-size vectors in r对 r 中大小不等的向量列表进行排序
【发布时间】:2015-11-17 12:19:10
【问题描述】:

假设我有几个向量 - 也许它们存储在一个列表中,但如果有更好的数据结构也可以:

ll <- list(c(1,3,2),
           c(1,2),
           c(2,1),
           c(1,3,1))

我想对它们进行排序,使用第一个数字,然后是第二个数字来解决平局,然后是第三个数字来解决剩余的平局,等等:

c(1,2)
c(1,3,1)
c(1,3,2)
c(2,1)

是否有任何内置函数可以让我这样做,还是我需要推出自己的解决方案?

(对于那些了解 Python 的人来说,我追求的是模仿 Python 中排序行为的东西)

【问题讨论】:

  • 这就是你要找的"Lexicographical order"
  • 请注意(我应该在问题中指定这一点):每个向量的元素可能不止一个数字,例如一个向量可以是 c(1,10,1)
  • 为了使您的排序有意义,所有向量应该具有相同的长度(即,用NA 值填充)。在这种情况下,matrixdata.frame 将是一个合理的数据结构。我的回答假设您不想更改向量。
  • @Roland:为什么用可变向量长度进行排序没有意义?百科全书的词序不也是一样的吗?
  • 我不确定我是否同意排序只有在所有向量长度相同时才有意义的想法。我正在玩一个扑克程序,将这里的 Python 代码:udacity.com/wiki/cs212/unit-1 翻译成 R,看看它是如何工作的。手牌的顺序是在该链接的程序中使用不等长的向量计算出来的(参见“扑克问题的完整代码”),我认为这是对不等长向量进行排序的一个有意义的用例。话虽如此,我同意要在 R 中解决这个问题,似乎最容易使所有向量的长度相同

标签: r sorting


【解决方案1】:
ll <- list(c(1,3,2),
           c(1,2),
           c(2,1),
           c(1,3,1))

我更喜欢使用NA 来处理缺失值并使用rbind.data.frame 而不是paste

sortfun <- function(l) {
  l1 <- lapply(l, function(x, n) {
    length(x) <- n
    x
  }, n = max(lengths(l)))
  l1 <- do.call(rbind.data.frame, l1)
  l[do.call(order, l1)] #order's default is na.last = TRUE
}

sortfun(ll)

#[[1]]
#[1] 1 2
#
#[[2]]
#[1] 1 3 1
#
#[[3]]
#[1] 1 3 2
#
#[[4]]
#[1] 2 1

【讨论】:

  • 不错。我猜这行的改进可能是ll[do.call(order,lapply(seq_len(max(lengths(ll))),function(x) vapply(ll,"[",FUN.VALUE=1,x)))],在这个过程中不需要构建data.frame
  • 谢谢。在观看此线程时,我试图创建自己的解决方案。它与您的相似,但我真的很喜欢您的 length(x) &lt;- n 技巧,我没有意识到这是可能的。我也不知道你能做到rbind.data.frame(我分两步完成)。
【解决方案2】:

这是一种使用data.table 的方法。

结果是一个矩形data.table,其中的行按您描述的形式排序。 NA 值在列表项长度不同的地方填充。

library(data.table)
setorderv(data.table(do.call(cbind, transpose(l))), paste0("V", 1:max(lengths(l))))[]
#    V1 V2 V3
# 1:  1  2 NA
# 2:  1  3  1
# 3:  1  3  2
# 4:  2  1 NA

这很难看,但您可以使用列表中的结果,例如:

l[setorderv(
  data.table(
    do.call(cbind, transpose(l)))[
      , ind := seq_along(l)][], 
  paste0("V", seq_len(max(lengths(l)))))$ind]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2011-05-16
    • 2018-01-11
    • 1970-01-01
    • 2015-08-16
    • 2023-03-05
    • 2020-12-27
    相关资源
    最近更新 更多