【问题标题】:Change row order in a matrix/dataframe更改矩阵/数据框中的行顺序
【发布时间】:2011-11-01 01:33:46
【问题描述】:

我需要更改/反转数据框中的行,而不是转置数据,而是将底行移动到顶部等等。如果数据框是:

1 2 3 
4 5 6
7 8 9

我需要转换成

7 8 9
4 5 6
1 2 3

我已阅读有关 sort() 的信息,但我认为这不是我需要的,或者我无法找到方法。

【问题讨论】:

    标签: r matrix dataframe


    【解决方案1】:

    今天遇到这个问题,在这里我为您的兴趣提供另一种解决方案。

    m <- matrix(1:9, ncol=3, byrow=TRUE)    
    apply(m,2,rev)
    

    【讨论】:

      【解决方案2】:

      我认为这是最简单的方法:

      MyMatrix = matrix(1:20, ncol = 2)
      MyMatrix[ nrow(MyMatrix):1, ]
      

      如果你想反转列,只需这样做

      MyMatrix[ , ncol(MyMatrix):1 ]
      

      【讨论】:

        【解决方案3】:

        我们可以颠倒 row.names 的顺序(仅适用于 data.frame):

        # create data.frame
        m <- matrix(1:9, ncol=3, byrow=TRUE)
        df_m <- data.frame(m)
        
        #reverse
        df_m[rev(rownames(df_m)), ]
        
        #   X1 X2 X3
        # 3  7  8  9
        # 2  4  5  6
        # 1  1  2  3
        

        【讨论】:

          【解决方案4】:

          很晚了,但这似乎工作得很快,不需要任何额外的包并且很简单:

          for(i in 1:ncol(matrix)) {matrix[,i] = rev(matrix[,i])}
          

          我想如果经常使用,人们会用它来做一个功能。 使用 R v=3.3.1 测试。

          【讨论】:

          • 通常推荐使用dplyr::arrange 或某种形式的seq 的矢量化解决方案,因为R 针对矢量运算而不是循环进行了优化。 accepted answer 也不依赖任何额外的包。
          【解决方案5】:

          我会将行反转为从行数开始的索引,沿着这条线

          revdata <-  thedata[dim(thedata)[1L]:1,]
          

          【讨论】:

            【解决方案6】:

            您可以使用 dplyr 包反转 data.frame 的顺序:

            iris %>% arrange(-row_number())
            

            或者不使用管道操作符

            arrange(iris, -row_number())
            

            【讨论】:

            • iris[order(row.names(iris), decreasing = T),]
            • @VeerendraGadekar 我认为您的解决方案不太直观,因为它有一个“孤儿”逗号,两次指定感兴趣的表,并且混合了圆括号和方括号。我知道这是正确的 base-r 语法,但在我看来它缺乏一些优雅。
            • @VeerendraGadekar 实际上这将无法正常工作,因为row.numbers 实际上是characters。您需要先转换integer,如iris[order(as.integer(row.names(iris)), decreasing = TRUE),]
            • iris %&gt;% arrange(desc(row_number()))
            【解决方案7】:

            可能有更优雅的方法,但这是可行的:

            m <- matrix(1:9, ncol=3, byrow=TRUE)
            
            # m[rev(seq_len(nrow(m))), ]  # Initial answer
            m[nrow(m):1, ]
                 [,1] [,2] [,3]
            [1,]    7    8    9
            [2,]    4    5    6
            [3,]    1    2    3
            

            这是有效的,因为您正在使用反向整数序列作为行索引来索引矩阵。 nrow(m):1 导致 3 2 1

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-04
              • 2019-02-20
              • 2023-02-22
              • 2020-12-21
              • 1970-01-01
              • 2023-03-12
              相关资源
              最近更新 更多