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

How to sort rows of a data frame based on a vector using dplyr pipe

提问人:littleworth 提问时间:9/7/2018 更新时间:9/7/2018 访问量:11638

问:

我有以下数据框:

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

评论


答:

28赞 Ronak Shah 9/7/2018 #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
5赞 akrun 9/7/2018 #2

我们可以将列转换为指定为“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