如何使用dplyr管道基于向量对数据帧的行进行排序

时间:2018-09-07 06:14:15

标签: 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

我要做的是对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

2 个答案:

答案 0 :(得分:4)

我们可以将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

答案 1 :(得分:1)

我们可以将列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