如何使用 dplyr 管道根据向量对数据框的行进行排序

sca*_*der 5 r dplyr

我有以下数据框:

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
Run Code Online (Sandbox Code Playgroud)

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

my_order <- c('t','f','x','b','i')
Run Code Online (Sandbox Code Playgroud)

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

  var1 var2 var3 var4
    2    t    5    b
    3    f    8    e
    1    x    7    w
    2    b    5    f
    1    i    5    i
Run Code Online (Sandbox Code Playgroud)

我想在 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
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 16

我们可以使用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
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

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

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
Run Code Online (Sandbox Code Playgroud)