【问题标题】:Reorder rows in R dataframe by column value [duplicate]按列值重新排序 R 数据框中的行 [重复]
【发布时间】:2023-01-19 01:01:30
【问题描述】:

我有一个名为 tab12 的数据框,如下所示:

df <- structure(list(sector = c("Public", "Private", "Other"), mean = c(340L, 
125L, 654L), median = c(876L, 543L, 234L)), class = "data.frame", row.names = c(NA, 
-3L))

sector  mean    median
Public  340     876
Private 125     543
Other   654     234

我需要对行重新排序,以便顺序为“其他”、“公共”、“私人”。我知道我可以通过索引来做到这一点(例如 [c(3, 1, 2), ] 但有没有办法通过使用扇区列的值(“公共”、“私人”和“其他” )?

我努力了:

tab12 &lt;- tab12$Sector[c("Other", "Public", "Private")]

任何帮助或指导将不胜感激。 谢谢

【问题讨论】:

    标签: r dataframe row


    【解决方案1】:

    character 向量(就像你的 sector 列)默认情况下会按字母顺序排序,如果你订购的话。您可以将它们转换为 factor 类分类向量,您可以定义自定义顺序,然后进行排序。

    如果你喜欢dplyr

    tab12 %>%
      mutate(Sector = factor(Sector, levels = c("Other", "Public", "Private")) %>%
      arrange(Sector)
    

    如果你更喜欢 base R:

    tab12$Sector = factor(tab12$Sector, levels = c("Other", "Public", "Private"))
    tab12 = tab12[order(tab12$Sector), ]
    

    我更喜欢将这样的自定义排序编码为 factor 而不是仅仅重新排序行,原因如下:

    • 它很好地推广到其他功能(例如,绘图轴、图例、建模)
    • 无论每个值是一个还是多个,它都有效

    【讨论】:

      【解决方案2】:

      使用match 的另一种选择:

      df[match(c("Other", "Public", "Private"), df$sector),]
      #>    sector mean median
      #> 3   Other  654    234
      #> 1  Public  340    876
      #> 2 Private  125    543
      

      创建于 2023-01-18 reprex v2.0.2

      【讨论】:

        【解决方案3】:

        我们可以转换为因子类并重新调整水平,然后使用arrange

        library(dplyr)
        
        df %>% 
          mutate(sector = factor(sector, levels = c("Other", "Public", "Private"))) %>% 
          arrange(sector)
        
           sector mean median
        1   Other  654    234
        2  Public  340    876
        3 Private  125    543
        

        【讨论】:

          猜你喜欢
          • 2018-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-20
          • 2020-08-29
          • 2021-08-03
          • 2020-09-28
          相关资源
          最近更新 更多