我有这个向量,我想对其进行排序。
v1<-c(1,10,2,6,8,1,3,5,"a","ab","c","d","aa","abc","a a","a bc")
.
但是向量中同时包含数字和字符。所以我需要在字符之后进行数字排序。 代码
library(gtools); mixedsort(v1)
完全按照要求解决了目的。
但我将其应用于大约 300 万个数据集。所以它效率不高,我需要一个可以更快处理它的代码。
解决方案应该是这样的。
> mixedsort(v1)
[1] "1" "1" "2" "3" "5" "6" "8" "10" "a" "a a" "a bc" "aa" "ab" "abc" "c" "d"
非常感谢
奇怪的是,这种笨拙的 dplyr/readr 方法比
mixedsort
快 27 倍,比 stringr::str_sort
快 3 倍,所以很明显还有更多的空间可以更快地做到这一点。
# fake data, 3 million rows of characters and numbers
v1 <- sample(c(1:99, LETTERS), 3E6, replace = TRUE)
parse_arrange <- function(a) {
data.frame(a) %>%
mutate(num = parse_number(a)) %>%
arrange(num, a) %>%
pull(a)
}
microbenchmark::microbenchmark(
gtools::mixedsort(v1),
stringr::str_sort(v1, numeric = TRUE),
parse_arrange(v1),
times = 1
)
Unit: seconds
expr min lq mean median uq max neval
gtools::mixedsort(v1) 70.954993 70.954993 70.954993 70.954993 70.954993 70.954993 1
stringr::str_sort(v1, numeric = TRUE) 6.276049 6.276049 6.276049 6.276049 6.276049 6.276049 1
parse_arrange(v1) 2.601381 2.601381 2.601381 2.601381 2.601381 2.601381 1
identical(gtools::mixedsort(v1),
parse_arrange(v1))
# TRUE