安排订单“run_1”后跟“run_2”而不是“run_11”

时间:2017-02-15 21:54:44

标签: r

我有一个像下面这样的东西。

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

有什么方法可以解决它吗?

4 个答案:

答案 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