在 R 中对非常大的数据集进行排序

问题描述 投票:0回答:1

我有这个向量,我想对其进行排序。

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"  

非常感谢

r data.table
1个回答
1
投票

奇怪的是,这种笨拙的 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
© www.soinside.com 2019 - 2024. All rights reserved.