如果您正在寻找tidyverse
/forcats
解决方案:
生成数据:
items <- data.frame(label = as.character(0:39),stringsAsFactors = FALSE)
# if stringsAsFactors = TRUE (default), items$label must be converted to character before casting to integer!
factor(items$label)
#> [1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#> [24] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#> 40 Levels: 0 1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 26 ... 9
使用fct_relevel
library(forcats)
fct_relevel(items$label,function(x){as.character(sort(as.integer(x)))})
#> [1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#> [24] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#> 40 Levels: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 39
它也适用于fct_reorder
fct_reorder(items$label,as.integer(items$label))
#> [1] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#> [24] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#> 40 Levels: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 39
如果您的向量还包含字符(例如1 egg
,2 eggs
等),这会带来一些不错的可能性:
items$label2 <- paste(items$label,"eggs")
factor(items$label2)
#> [1] 0 eggs 1 eggs 2 eggs 3 eggs 4 eggs 5 eggs 6 eggs 7 eggs
#> [9] 8 eggs 9 eggs 10 eggs 11 eggs 12 eggs 13 eggs 14 eggs 15 eggs
#> [17] 16 eggs 17 eggs 18 eggs 19 eggs 20 eggs 21 eggs 22 eggs 23 eggs
#> [25] 24 eggs 25 eggs 26 eggs 27 eggs 28 eggs 29 eggs 30 eggs 31 eggs
#> [33] 32 eggs 33 eggs 34 eggs 35 eggs 36 eggs 37 eggs 38 eggs 39 eggs
#> 40 Levels: 0 eggs 1 eggs 10 eggs 11 eggs 12 eggs 13 eggs ... 9 eggs
library(readr)
fct_reorder(items$label2,parse_number(items$label2))
#> [1] 0 eggs 1 eggs 2 eggs 3 eggs 4 eggs 5 eggs 6 eggs 7 eggs
#> [9] 8 eggs 9 eggs 10 eggs 11 eggs 12 eggs 13 eggs 14 eggs 15 eggs
#> [17] 16 eggs 17 eggs 18 eggs 19 eggs 20 eggs 21 eggs 22 eggs 23 eggs
#> [25] 24 eggs 25 eggs 26 eggs 27 eggs 28 eggs 29 eggs 30 eggs 31 eggs
#> [33] 32 eggs 33 eggs 34 eggs 35 eggs 36 eggs 37 eggs 38 eggs 39 eggs
#> 40 Levels: 0 eggs 1 eggs 2 eggs 3 eggs 4 eggs 5 eggs 6 eggs ... 39 eggs
由reprex 包(v0.3.0)于 2019 年 6 月 26 日创建
fct_* 函数的所有输出都可以写回原始数据。例如:
items$data <- fct_reorder(items$label,as.integer(items$label))