我有一个像下面这样的东西。
test <- tibble(run = c("run_1","run_2", "run_3", "run_11", "run_111", "run_4"))
test %>% arrange(run)
给了我
1 run_1
2 run_11
3 run_111
4 run_2
5 run_3
6 run_4
但我想要
1 run_1
2 run_2
3 run_3
4 run_4
5 run_11
6 run_111
有什么方法可以解决它吗?
答案 0 :(得分:3)
修改强>
使用mixedorder
功能:
library(gtools)
test <- tibble(run = c("run_1","run_2", "run_3", "run_11", "run_111", "run_4"))
test[mixedorder(test$run),]
# A tibble: 6 × 1
run
<chr>
1 run_1
2 run_2
3 run_3
4 run_4
5 run_11
6 run_111
原始回答:
使用mixedsort
功能:
library(gtools)
test <- c("run_1","run_2", "run_11", "run_3")
mixedsort(test)
[1] "run_1" "run_2" "run_3" "run_11"
答案 1 :(得分:2)
你可以在gtools包中使用mixedsort:
gtools::mixedsort
答案 2 :(得分:1)
如何使用tidyr / dplyr:
test %>% separate(run, into=c("prefix","suffix")) %>% arrange(as.numeric(suffix)) %>% mutate(new_test=apply( . , 1 , paste , collapse = "_" ))
A tibble: 6 × 3
prefix suffix new_test
<chr> <chr> <chr>
1 run 1 run_1
2 run 2 run_2
3 run 3 run_3
4 run 4 run_4
5 run 11 run_11
6 run 111 run_111
答案 3 :(得分:0)
提取要排序的字符串部分,然后按
排序library(tibble)
test <- tibble(run = c("run_1","run_2", "run_3", "run_11", "run_111", "run_4"))
test %>%
mutate(num = as.integer(gsub("^[^0-9]*(\\d*)", "\\1", run))) %>%
arrange(num)
#> # A tibble: 6 x 2
#> run num
#> <chr> <int>
#> 1 run_1 1
#> 2 run_2 2
#> 3 run_3 3
#> 4 run_4 4
#> 5 run_11 11
#> 6 run_111 111