Gibt es einen einfachen und schnellen Weg, um die Häufigkeit jeder ganzen Zahl zu erhalten, die in einem Vektor von Ganzzahlen in R auftritt?Was ist der schnellste Weg, um Häufigkeiten von ganzen Zahlen in einem Vektor zu erhalten?
Hier sind Versuche, meine bisher:
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
und hier sind die Ergebnisse:
[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
Wie Sie table
unglaublich langsam ist und hist
scheint sehen die schnellste zu sein. Aber hist
(wie ich es benutze) arbeitet an beliebig spezifizierbaren Breakpoints, während ich einfach ganze Zahlen bin bin. Gibt es keine Möglichkeit, diese Flexibilität für bessere Leistung zu tauschen?
In C würde for(i=0;i<1000000;i++)h[x[i]]++;
mörderisch schnell sein.
Inline kann ein bisschen ein Schmerz sein, um zu arbeiten. Unter Windows benötigen Sie das [rtools package] (http://cran.r-project.org/bin/windows/Rtools/), aber ich bin mir nicht sicher über Ubuntu. Ich habe deine Tests mit meinem Code durchgeführt und es hat 4 mal schneller gewonnen als die Tabulate-Lösung. – Joe