web-dev-qa-db-fra.com

Compter le nombre de valeurs distinctes dans un vecteur

J'ai un vecteur de valeurs scalaires dont j'essaye d'obtenir: "Combien de valeurs différentes y a-t-il".

Par exemple, dans group <- c(1,2,3,1,2,3,4,6) les valeurs uniques sont 1,2,3,4,6 donc je veux obtenir 5.

Je suis venu avec:

length(unique(group))

Mais je ne suis pas sûr que ce soit le moyen le plus efficace de le faire. N'y a-t-il pas une meilleure façon de procéder?

Remarque: Mon cas est plus complexe que l'exemple, composé d'environ 1000 nombres avec au plus 25 valeurs différentes.

30
AdrieanKhisbe

Voici quelques idées, tout indique que votre solution est déjà très rapide. length(unique(x)) est ce que j'aurais aussi utilisé:

x <- sample.int(25, 1000, TRUE)

library(microbenchmark)
microbenchmark(length(unique(x)),
               nlevels(factor(x)),
               length(table(x)),
               sum(!duplicated(x)))
# Unit: microseconds
#                 expr     min       lq   median       uq      max neval
#    length(unique(x))  24.810  25.9005  27.1350  28.8605   48.854   100
#   nlevels(factor(x)) 367.646 371.6185 380.2025 411.8625 1347.343   100
#     length(table(x)) 505.035 511.3080 530.9490 575.0880 1685.454   100
#  sum(!duplicated(x))  24.030  25.7955  27.4275  30.0295   70.446   100
32
flodel

J'ai utilisé cette fonction

length(unique(array))

et cela fonctionne bien, et ne nécessite pas de bibliothèques externes.

7
lindix

Vous pouvez utiliser rle à partir du package base

  x<-c(1,2,3,1,2,3,4,6)
  length(rle(sort(x))$values)

rle produit deux vecteurs (lengths et values). La longueur du vecteur values vous donne le nombre de valeurs uniques.

5
Sri

uniqueN fonction de data.table est équivalente à length(unique(group)). Il est également plusieurs fois plus rapide sur les grands ensembles de données, mais pas tant sur votre exemple.

library(data.table)
library(microbenchmark)

xSmall <- sample.int(25, 1000, TRUE)
xBig <- sample.int(2500, 100000, TRUE)
microbenchmark(length(unique(xSmall)), uniqueN(xSmall), 
               length(unique(xBig)), uniqueN(xBig))

#Unit: microseconds
#                    expr      min        lq       mean    median        uq      max neval cld
#1 length(unique(xSmall))   17.742   24.1200   34.15156   29.3520   41.1435  104.789   100 a  
#2        uniqueN(xSmall)   12.359   16.1985   27.09922   19.5870   29.1455   97.103   100 a  
#3   length(unique(xBig)) 1611.127 1790.3065 2024.14570 1873.7450 2096.5360 3702.082   100 c
#4          uniqueN(xBig)  790.576  854.2180  941.90352  896.1205  974.6425 1714.020   100 b 
4
eillasti

Si l'on veut obtenir le nombre d'éléments uniques dans une matrice ou un bloc de données ou une liste, le code suivant ferait l'affaire:

  if( typeof(Y)=="list"){ # Y is a list or data frame
    # data frame to matrix
    numUniqueElems <- length( na.exclude( unique(unlist(Y)) ) )
  } else if ( is.null(dim(Y)) ){ # Y is a vector
    numUniqueElems <- length( na.exclude( unique(Y) ) )
  } else { # length(dim(Y))==2, Yis a matrix
    numUniqueElems <- length( na.exclude( unique(c(Y)) ) )
  }
0
Good Will