我有以下数据框:
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
答案 0 :(得分:4)
我们可以将arrange
与match
一起使用
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