【问题标题】:Sorting dataframe first by a column based on a list then by ascending numbers in another column [duplicate]首先根据列表按列对数据框进行排序,然后按另一列中的升序对数据框进行排序[重复]
【发布时间】:2023-03-13 19:11:01
【问题描述】:
set.seed(42)
df <- data.frame(letters=c(rep('data', 5), rep('oh', 5), rep('yeah', 5), rep('silly', 5)),
                 numbers=runif(n = 20, min = 1, max = 10))

我知道我可以按字母 col 字母排序,然后按数字 col 数字排序,如下所示:

 df[with(df, order(letters, numbers)), ]

差不多了,但我想强制字母 col 首先按此顺序排序 c('silly', 'data', 'oh', 'yeah')

如何做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用match

    df[with(df, order(match(letters, c('silly', 'data', 'oh', 'yeah')), numbers)),]
    

    -输出

     letters  numbers
    18   silly 2.057386
    19   silly 5.274974
    20   silly 6.042995
    16   silly 9.460131
    17   silly 9.804038
    3     data 3.575256
    5     data 6.775710
    4     data 8.474029
    1     data 9.233254
    2     data 9.433679
    8       oh 2.211999
    6       oh 5.671864
    9       oh 6.912931
    10      oh 7.345583
    7       oh 7.629295
    14    yeah 3.298859
    11    yeah 5.119676
    15    yeah 5.160635
    12    yeah 7.472010
    13    yeah 9.412050
    

    或者另一个选项是factor,并在订单中指定levels

    df[with(df, order(factor(letters, levels = c('silly', 'data', 'oh', 'yeah')), numbers)),]
    

    【讨论】:

      【解决方案2】:

      这是一个 dplyr 解决方案,也使用 akrun 提供的 match

      library(dplyr)
      df %>% 
        arrange(match(letters, c('silly', 'data', 'oh', 'yeah')), numbers)
      
             letters  numbers
      1    silly 2.057386
      2    silly 5.274974
      3    silly 6.042995
      4    silly 9.460131
      5    silly 9.804038
      6     data 3.575256
      7     data 6.775710
      8     data 8.474029
      9     data 9.233254
      10    data 9.433679
      11      oh 2.211999
      12      oh 5.671864
      13      oh 6.912931
      14      oh 7.345583
      15      oh 7.629295
      16    yeah 3.298859
      17    yeah 5.119676
      18    yeah 5.160635
      19    yeah 7.472010
      20    yeah 9.412050
      

      【讨论】:

        猜你喜欢
        • 2010-11-20
        • 2018-06-25
        • 2018-05-30
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 2022-09-28
        相关资源
        最近更新 更多