【问题标题】:in R sort row data in ascending order在R中按升序对行数据进行排序
【发布时间】:2015-01-21 12:44:49
【问题描述】:

我有一个格式如下的矩阵:

    M1 M2 M3 M4 M5 S1 S2
V1  14 19 28 43 10  3  4
V7  25 30 24  9 39  8  4
V8  34 39  6 35 19  9  5

我想对每一行[1:5] 再将行[6:7] 进行升序排序,返回如下结果:

      M1 M2 M3 M4 M5 S1 S2
  V1  10 14 19 28 43 3 4
  V7  9  24 25 30 39 4 8
  V8  6  19 34 35 39 5 9

我查看了有关排序/顺序主题的堆栈溢出答案,但没有发现任何可以达到此结果的内容。 有人可以建议前进的方向吗?如果无法在行内移动值且列名必须随值的位置而改变,则列名和行名在结果中并不重要。

【问题讨论】:

  • 我希望每一行都按升序排列,即 M1 到 M5 按升序排列,S1 和 S2 按升序排列。每一行都被视为一个单独的“向量”
  • 可能一种有效的解决方法是使用 t(matrix) 转置矩阵,然后对每一列进行排序;之后你转回来。

标签: r sorting


【解决方案1】:
m <- as.matrix(read.table(text= "    M1 M2 M3 M4 M5 S1 S2
V1  14 19 28 43 10  3  4
V7  25 30 24  9 39  8  4
V8  34 39  6 35 19  9  5", header = TRUE))

t(apply(m, 1, function(x) c(sort(x[1:5]), sort(x[6:7]))))
#   [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#V1   10   14   19   28   43    3    4
#V7    9   24   25   30   39    4    8
#V8    6   19   34   35   39    5    9

【讨论】:

  • 我们在同一时间回复,但我喜欢c 方法!
【解决方案2】:

如果matt 是您的矩阵:

cbind(t(apply(matt[,1:5], 1, sort)),t(apply(matt[,6:7], 1, sort)))

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   10   14   19   28   43    3    4
[2,]    9   24   25   30   39    4    8
[3,]    6   19   34   35   39    5    9

或使用plyr 以提高可读性:

library(plyr)

f = function(vec) aaply(matt[,vec], 1, sort)
cbind(f(1:5), f(6:7))

【讨论】:

  • 太棒了,谢谢。之前尝试过 apply(),但没有 t(apply()。非常感谢。
  • 使用 plyr 选项,您不必使用转置运算符!
【解决方案3】:
my_data <- matrix(data = c(14, 19, 28, 43, 10, 3, 4, 25, 30, 24, 9, 39, 8, 4, 34, 39, 6, 35, 19, 9, 5), nrow = 3, ncol = 7, byrow = TRUE)

首先我创建了一个result 矩阵,

result <- matrix(nrow = 3, ncol = 7)

然后对于每个my_data 的行,我对前五个元素进行排序,对第 6 和第 7 个元素进行排序,将它们绑定在一起并将它们全部放入 result 矩阵中。

for (i in 1:nrow(my_data)) { result[i, ] <- c(sort(my_data[i, 1:5]), sort(my_data[i, 6:7]))}

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2019-07-23
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多