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.
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
J'ai utilisé cette fonction
length(unique(array))
et cela fonctionne bien, et ne nécessite pas de bibliothèques externes.
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.
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
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)) ) )
}