Я знаю, что data.table
реализует Radix сортировки из коробки, так что вы можете использовать этот пакет и, например, сортировать данные, просто установив ключ:
library(data.table)
vec <- c(25, 478, 34, 9021, 6, 9947, 504, 22)
f1<-function(vec){
DT<-data.table(vec)
setkey(DT, vec)
DT
}
f1(vec)
vec
1: 6
2: 22
3: 25
4: 34
5: 478
6: 504
7: 9021
8: 9947
I предположим, что вы могли бы реализовать алгоритм самостоятельно, но это, вероятно, будет медленным в R. функция будет выглядеть примерно так:
library(stringr)
library(dplyr)
library(tidyr)
radix<-function(numbers){
digits<-nchar(max(numbers))
numbers<-str_pad(numbers, digits, pad = "0")
rad<-data.frame(matrix(0, ncol = digits, nrow = length(numbers)))
for(i in 1:digits){
rad[,i] <- str_sub(numbers, i,i)
}
for(z in rev(1:ncol(rad))){
a <- which(rad[,z] == 0)
b <- which(rad[,z] == 1)
c <- which(rad[,z] == 2)
d <- which(rad[,z] == 3)
e <- which(rad[,z] == 4)
f <- which(rad[,z] == 5)
g <- which(rad[,z] == 6)
h <- which(rad[,z] == 7)
i <- which(rad[,z] == 8)
j <- which(rad[,z] == 9)
k<-c(a,b,c,d,e,f,g,h,i,j)
rad<-rad[k,]
}
rad<-rad %>% unite_(col = "num", from = colnames(rad), sep = "")
return(as.numeric(rad$num))
}
It может быть очищен/скорость, но это делает базисное то, как я понимаю:
radix(vec)
[1] 6 22 25 34 478 504 9021 9947
Для сравнения скорости:
microbenchmark(f1(vec), radix(vec))
Unit: microseconds
expr min lq mean median uq max neval
f1(vec) 290.6 314.8 335 327 349.1 524.1 100
radix(vec) 1062.8 1121.7 1458 1163 1250.5 24407.9 100
Larger Сравнение скорости:
set.seed(200)
more<-sample(10000,5000)
microbenchmark(f1(more), radix(more))
expr min lq mean median uq max neval
f1(more) 539.3 565.5 623 622.2 664.8 769.7 100
radix(more) 10457.8 10668.0 11683 11133.7 12298.3 25010.6 100
Если вы, в частности, хотите внедрить сортировку радикса в R, включена сортировка радикса (из «data.table») в R 3.3.0 - 'sort (vec, method =" radix ")' –
@alexis_laz да, я особенно интересовался внедрением алгоритма. Его принцип алгоритмически красив. – 989
Как простой, более счетный тип сортировки, см. 'Rep (seq_len (max (vec)), tabulate (vec))' (который, с большими целыми числами, также потребует большой объем памяти), который, в основном, просто помещает целые числа в ведра и выбирает ненулевые элементы –