【问题标题】:How to order a matrix by the numeric or alphabetic values of the column vectors in R?如何通过 R 中列向量的数字或字母值对矩阵进行排序?
【发布时间】:2019-11-06 14:53:04
【问题描述】:

下面例子的标题应该是不言自明的:

m = unique(replicate(5, sample(1:5, 5, rep=F)), MARGIN = 2)
m
      [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    1    4    3
[2,]    5    1    5    1    2
[3,]    4    3    3    3    1
[4,]    3    4    4    5    5
[5,]    2    2    2    2    4

但我想要的是:

      [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    3    4    5
[2,]    5    5    2    1    1
[3,]    3    4    1    3    3
[4,]    4    3    5    5    4
[5,]    2    2    4    2    2

理想情况下,我想找到一种方法,当列向量是单词(字母顺序)时,可以执行相同的过程。

我尝试了m[ , sort(m)] 之类的方法,但没有成功...

【问题讨论】:

  • 所以你只想按第一行排序?
  • 那么,您希望列按第一行值排序,用作平局第二行值、第三行值等?

标签: r sorting matrix


【解决方案1】:

m[, order(m[1, ]) 将按第一行对列进行排序。 m[, order(m[1, ], m[2, ])] 将按第一行排序,使用第二行作为决胜局。变得花哨,m[, do.call(order, split(m, row(m)))] 将按第一行对列进行排序,将所有后续行用于决胜局。这将与 character 数据和 numeric 一样工作。

set.seed(47)
m = replicate(5, sample(1:5, 5, rep=F))
m
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    5    4    1    5    1
# [2,]    2    2    3    2    3
# [3,]    3    5    5    1    2
# [4,]    4    3    2    3    5
# [5,]    1    1    4    4    4
m[, do.call(order, split(m, row(m)))]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    4    5    5
# [2,]    3    3    2    2    2
# [3,]    2    5    5    1    3
# [4,]    5    2    3    3    4
# [5,]    4    4    1    4    1

【讨论】:

  • 太棒了!有用。能否请您根据 OP 代码的微小变化进行调整?
  • 是的,只是为了 OP 和答案之间的一致性。我知道答案本身没有区别。
  • 模拟数据的时候最好set.seed(),这样可以重现。我摆脱了unique(),因为它什么也没做。我建议复制我更新的代码(包括 set.seed() 到问题的一致性 - 设置种子意味着即使是随机值也将是可重现的并且在问题和答案中都匹配。
猜你喜欢
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2013-07-06
  • 2021-07-28
  • 1970-01-01
相关资源
最近更新 更多