相当简单的问题我似乎无法想出一个优雅的解决方案。

我想通过不同的降序排列一列数据:

library(dplyr)
test <- data.frame(ID=c(19000,19001,19002,1,2))

test %>%
  arrange(desc(ID)) %>%
  mutate(ID = formatC(ID,width=5,format="d",flag="0"))

     ID
1 19002
2 19001
3 19000
4 00002
5 00001

我想:
     ID
1 00002
2 00001
3 19002
4 19001
5 19000

这是用于管道,因此将添加更多 ID,例如00003, 00004....

这是我想出的东西:
test %>%
  mutate(ID = formatC(ID,width=5,format="d",flag="0")) %>%
  group_by(group=substr(ID,1,1)) %>%
  arrange(desc(ID)) %>%
  arrange(group) %>%
  ungroup() %>%
  select(ID)

还有比这更好的吗?

编辑 -
library(microbenchmark)

test <- data.frame(ID=c(1:29999))

microbenchmark(group = test %>%
                 mutate(ID = formatC(ID,width=5,format="d",flag="0"),
                        group = substr(ID,1,1)) %>%
                 arrange(group, desc(ID)) %>%
                 select(ID),

               mod = test %>%
                 arrange(ID %/% 1000, desc(ID %% 1000)) %>%
                 mutate(ID = formatC(ID,width=5,format="d",flag="0")))

Unit: milliseconds
expr      min        lq     mean    median       uq      max neval cld
group 138.0480 152.21025 168.7705 160.41305 176.6362 352.4736   100   b
mod  27.7697  29.94265  34.1312  31.92085  35.5323  88.8065   100  a

谢谢大家!看起来我有我的答案。

最佳答案

您可以只按千位数排序,然后按模 1000 降序排序。这样您就不需要添加组列。

library(dplyr)
test <- data.frame(ID=c(19000,19001,19002,1,2))

test %>%
  arrange(ID %/% 1000, desc(ID %% 1000)) %>%
  mutate(ID = formatC(ID,width=5,format="d",flag="0"))

#>     ID
#> 1 00002
#> 2 00001
#> 3 19002
#> 4 19001
#> 5 19000

关于r - 按不同的降序排列数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59565988/

10-12 19:10