我有以下数据框:
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
我们可以使用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
Run Code Online (Sandbox Code Playgroud)
我们可以将列转换为指定为“my_order”的列factor(levels但它不会更改实际列的类型)
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)
| 归档时间: |
|
| 查看次数: |
3927 次 |
| 最近记录: |