Y a-t-il un moyen simple et rapide d'obtenir la fréquence de chaque entier qui se produit dans un vecteur d'entiers dans Voici mes tentatives jusqu'à présent: P> [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
3 Réponses :
Le plus rapide est d'utiliser tabuler code> mais nécessite des entiers positifs comme entrée, vous devez donc faire une transformation monotonique rapide.
set.seed(21)
x <- as.integer(runif(1e6)*1000)
system.time({
adj <- 1L - min(x)
y <- setNames(tabulate(x+adj), sort(unique(x)))
})
N'oubliez pas que vous pouvez en ligne C ++ code dans R.
library(inline) src <- ' Rcpp::NumericVector xa(a); int n_xa = xa.size(); int test = max(xa); Rcpp::NumericVector xab(test); for (int i = 0; i < n_xa; i++) xab[xa[i]-1]++; return xab; ' fun <- cxxfunction(signature(a = "numeric"),src, plugin = "Rcpp")
Je pense que les versions de la tabulation ou de la C ++ sont la voie à suivre, mais voici quelques codes utilisant Rbenchmark, ce qui est un excellent package pour regarder des horaires (j'ai ajouté quelques tests de fonction plus lentes):
test replications elapsed relative user.self sys.self user.child sys.child 6 Ulrich.using_tabulate(x) 5 0.176 1.000 0.176 0.000 0.00 0.000 2 tennenrishin.using_hist(x) 5 0.468 2.659 0.468 0.000 0.00 0.000 3 tennenrishin.using_sort(x) 5 0.687 3.903 0.688 0.000 0.00 0.000 4 tennenrishin.using_ecdf(x) 5 0.749 4.256 0.748 0.000 0.00 0.000 7 Breyal.using_datatable(x) 5 2.960 16.818 2.960 0.000 0.00 0.000 1 tennenrishin.using_table(x) 5 4.651 26.426 4.596 0.052 0.00 0.000 9 Breyal.using_mclapply_8c_eq(x) 5 10.817 61.460 0.140 1.196 54.62 7.112 5 tennenrishin.using_counting_loop(x) 5 10.922 62.057 10.912 0.000 0.00 0.000 8 Breyal.using_lapply_1c_eq(x) 5 36.807 209.131 36.768 0.000 0.00 0.000
En ligne peut être un peu mal à travailler. Sur Windows, vous avez besoin du package RTools , mais je ne suis pas sûr de Ubuntu. J'ai couru vos tests avec mon code et gagné confortablement, 4 fois plus vite que la solution de tabulation.