【问题标题】:How to sort rows of a data frame based on a vector using dplyr pipe如何使用 dplyr 管道根据向量对数据帧的行进行排序
【发布时间】:2018-09-07 06:14:14
【问题描述】:

我有以下数据框:

library(tidyverse)
dat <- structure(list(var1 = c(1L, 2L, 2L, 3L, 1L), var2 = structure(c(10L, 
1L, 8L, 3L, 5L), .Label = c("b", "c", "f", "h", "i", "o", "s", 
"t", "w", "x"), class = "factor"), var3 = c(7L, 5L, 5L, 8L, 5L
), var4 = structure(c(8L, 5L, 1L, 4L, 7L), .Label = c("b", "c", 
"d", "e", "f", "h", "i", "w", "y"), class = "factor")), .Names = c("var1", 
"var2", "var3", "var4"), row.names = c(NA, 5L), class = "data.frame")


dat
#>   var1 var2 var3 var4
#> 1    1    x    7    w
#> 2    2    b    5    f
#> 3    2    t    5    b
#> 4    3    f    8    e
#> 5    1    i    5    i

我想要做的是对var2 列进行排序/排列 基于预定义的顺序:

my_order <- c('t','f','x','b','i')

最终想要的结果是这样的:

  var1 var2 var3 var4
    2    t    5    b
    3    f    8    e
    1    x    7    w
    2    b    5    f
    1    i    5    i

我想在 dplyr 管道下进行。我怎样才能做到这一点?

我最多只能这样做:

> dat  %>% 
+   arrange(var2)
  var1 var2 var3 var4
1    2    t    5    b
2    3    f    8    e
3    1    x    7    w
4    2    b    5    f
5    1    i    5    i

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用arrangematch

    library(dplyr)
    
    dat %>%
      arrange(match(var2, my_order))
    
    #  var1 var2 var3 var4
    #1    2    t    5    b
    #2    3    f    8    e
    #3    1    x    7    w
    #4    2    b    5    f
    #5    1    i    5    i
    

    【讨论】:

      【解决方案2】:

      我们可以将列转换为 factor 并将 levels 指定为“my_order”(但它不会更改实际列的类型)

      library(dplyr)
      dat %>% 
          arrange(factor(var2, levels = my_order))
      #  var1 var2 var3 var4
      #1    2    t    5    b
      #2    3    f    8    e
      #3    1    x    7    w
      #4    2    b    5    f
      #5    1    i    5    i
      

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多