【问题标题】:How to reverse the order of dataframe in a pattern in R如何在R中的模式中反转数据帧的顺序
【发布时间】:2020-12-10 20:17:14
【问题描述】:

我想按特定顺序反转以下数据帧。

Stage       Score 
W-3         25
W-3         2 Min 10 Sec
W-2         45
W-2         1 Min 34 Sec
W-1         75
W-1         1 Min 04 Sec

我想按以下顺序反转它。

Stage       Score
W-1         75
W-1         1 Min 04 Sec
W-2         45
W-2         1 Min 34 Sec
W-3         25
W-3         2 Min 10 Sec

我正在使用df<- df[seq(dim(df)[1],1),],但它不起作用。

【问题讨论】:

    标签: r dataframe dplyr data.table


    【解决方案1】:

    另一个使用 order + ave 的基本 R 选项

    df[with(df, order(Stage, ave(1:nrow(df), Stage, FUN = seq_along))), ]
    

    给了

      Stage        Score
    5   W-1           75
    6   W-1 1 Min 04 Sec
    3   W-2           45
    4   W-2 1 Min 34 Sec
    1   W-3           25
    2   W-3 2 Min 10 Sec
    

    数据

    > dput(df)
    structure(list(Stage = c("W-3", "W-3", "W-2", "W-2", "W-1", "W-1"
    ), Score = c("25", "2 Min 10 Sec", "45", "1 Min 34 Sec", "75",
    "1 Min 04 Sec")), row.names = c(NA, -6L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      我们可以使用factorlevels 在'Stage' 的unique 元素的reverse 顺序中指定

      library(dplyr)
      df2 <- df1 %>%
          arrange(factor(as.character(Stage), 
                   levels = rev(unique(as.character(Stage)))))
      

      “日期”列也是如此

      df1 %>%
          arrange(factor(as.character(Date), 
                   levels = rev(unique(as.character(Date)))))
      

      -输出

      # Stage        Score       Date
      #1   W-1 1 Min 04 Sec 2020-12-15
      #2   W-1           75 2020-12-14
      #3   W-2 1 Min 34 Sec 2020-12-13
      #4   W-2           45 2020-12-12
      #5   W-3 2 Min 10 Sec 2020-12-11
      #6   W-3           25 2020-12-10
      

      或使用base R

      df2 <- df1[order(factor(df1$Stage, levels = rev(unique(df1$Stage)))),]
      

      数据

      df1 <- structure(list(Stage = c("W-3", "W-3", "W-2", "W-2", "W-1", "W-1"
      ), Score = c("25", "2 Min 10 Sec", "45", "1 Min 34 Sec", "75", 
      "1 Min 04 Sec"), Date = structure(18606:18611, class = "Date")),
      row.names = c(NA, 
      -6L), class = "data.frame")
      

      【讨论】:

      • 同样不适用于日期(yyyy-mm-dd)格式。
      • @SophiaWilson 你能把它包装成as.character。作为更新后的帖子
      • 日期不走运。
      • @SophiaWilson 我更新了帖子。它现在适用于日期和字母数字
      【解决方案3】:

      我们也可以从gtools使用mixedorder

      df <- data.frame("Stage" = c('W-3', 'W-3', 'W-2',
                                   'W-2', 'W-1', 'W-1'),
                       "Score" = c(25, '2 Min 10 Sec', 45,
                                   '1 Min 34 Sec', 75, '1 Min 04 Sec' ))
      
      library(gtools)
      df[mixedorder(df$Stage, decreasing = T), ]
      

        Stage        Score
      5   W-1           75
      6   W-1 1 Min 04 Sec
      3   W-2           45
      4   W-2 1 Min 34 Sec
      1   W-3           25
      2   W-3 2 Min 10 Sec
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 2014-10-28
        • 1970-01-01
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多