Как я могу отсортировать вектор целых чисел в R? - PullRequest
1 голос
/ 02 марта 2020

Я работаю в R, используя арифметику произвольной точности c в пакете gmp . Этот пакет создает и сохраняет большие целые числа в форме bigz. Например, вы можете создать вектор из сколь угодно больших целых чисел следующим образом:

X <- as.bigz(c("734876349856913169345", "610034193791098", "82348779011105371828395319",
               "810367198176345917234", "92573840155289", "729811850143511981", "51385",
               "358934723", "751938475", "72265018270590", "12838756105612376401932875"));

Я бы хотел отсортировать этот вектор из больших целых чисел (от наименьшего к наибольшему). Хотя в документации для bigz объектов отмечается, что их можно сравнить с операциями неравенства, к сожалению, стандартная функция sort не работает с ними:

sort(X)
Error in rank(x, ties.method = "min", na.last = "keep") : 
  raw vectors cannot be sorted

Вопрос: Как можно Я беру вектор bigz, подобный приведенному выше, и сортирую его в порядке возрастания?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Другой вариант - mixedsort из gtools после преобразования в character

as.bigz(gtools::mixedsort(as.character(BIGINTEGERS)))
#Big Integer ('bigz') object of length 11:
# [1] 51385                      358934723                  751938475                 
# [4] 72265018270590             92573840155289             610034193791098           
# [7] 729811850143511981         734876349856913169345      810367198176345917234     
#[10] 12838756105612376401932875 82348779011105371828395319

, так как методы для класса 'bigz' включают as.character

grep('as.character', methods(class = 'bigz'), fixed = TRUE, value = TRUE)
#[1] "as.character.bigz"
1 голос
/ 02 марта 2020

Это включает в себя принуждение к строке и обратно, но вы можете использовать str_sort(). Аргумент numeric = TRUE дает естественный, а не буквенный порядок сортировки c.

library(stringr)
library(gmp)

as.bigz(str_sort(BIGINTEGERS, numeric = TRUE))
Big Integer ('bigz') object of length 11:
 [1] 51385                      358934723                  751938475                  72265018270590             92573840155289             610034193791098           
 [7] 729811850143511981         734876349856913169345      810367198176345917234      12838756105612376401932875 82348779011105371828395319
...