Esiste un modo semplice e veloce per ottenere la frequenza di ciascun numero intero che si verifica in un vettore di numeri interi in R?Qual è il modo più veloce per ottenere frequenze di numeri interi in un vettore?
Qui sono i miei tentativi finora:
x <- floor(runif(1000000)*1000)
print('*** using TABLE:')
system.time(as.data.frame(table(x)))
print('*** using HIST:')
system.time(hist(x,breaks=min(x):(max(x)+1),plot=FALSE,right=FALSE))
print('*** using SORT')
system.time({cdf<-cbind(sort(x),seq_along(x)); cdf<-cdf[!duplicated(cdf[,1]),2]; c(cdf[-1],length(x)+1)-cdf})
print('*** using ECDF')
system.time({i<-min(x):max(x); cdf<-ecdf(x)(i)*length(x); cdf-c(0,cdf[-length(i)])})
print('*** counting in loop')
system.time({h<-rep(0,max(x)+1);for(i in seq_along(x)){h[x[i]]<-h[x[i]]+1}; h})
#print('*** vectorized summation') #This uses too much memory if x is large
#system.time(colSums(matrix(rbind(min(x):max(x))[rep(1,length(x)),]==x,ncol=max(x)-min(x)+1)))
#Note: There are some fail cases in some of the above methods that need patching if, for example, there is a chance that some integer bins are unoccupied
e qui sono i risultati:
[1] "*** using TABLE:"
user system elapsed
1.26 0.03 1.29
[1] "*** using HIST:"
user system elapsed
0.11 0.00 0.10
[1] "*** using SORT"
user system elapsed
0.22 0.02 0.23
[1] "*** using ECDF"
user system elapsed
0.17 0.00 0.17
[1] "*** counting in loop"
user system elapsed
3.12 0.00 3.12
Come si può vedere table
è incredibilmente lento e hist
sembra essere il più veloce. Ma hist
(come sto usando) sta lavorando su breakpoint arbitrariamente specificabili, mentre io voglio semplicemente bin interi. Non c'è un modo per scambiare quella flessibilità per ottenere prestazioni migliori?
In C, for(i=0;i<1000000;i++)h[x[i]]++;
sarebbe velocissimo.
inline può essere un po 'un dolore per lavorare. Su Windows è necessario il [pacchetto rtools] (http://cran.r-project.org/bin/windows/Rtools/), ma non sono sicuro di Ubuntu. Ho eseguito i test con il mio codice e ha vinto comodamente, 4 volte più velocemente della soluzione tabulata. – Joe