6
votes

Quel est le moyen le plus rapide d'obtenir des fréquences d'entiers dans un vecteur?

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 r strong>?

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 


0 commentaires

3 Réponses :


7
votes

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)))
})


0 commentaires

5
votes

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")


0 commentaires

2
votes

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


1 commentaires

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.