相当简单的问题我似乎无法想出一个优雅的解决方案。
我想通过不同的降序排列一列数据:
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/