175 votes

Compter les valeurs uniques dans R

Disons que j'ai

 v = rep(c(1,2, 2, 2), 25)
 

Maintenant, je veux compter le nombre de fois que chaque valeur unique apparaît. unique(c) renvoie les valeurs uniques, mais pas leur nombre.

 > unique(v)
[1] 1 2
 

Je veux quelque chose qui me donne

 length(v[v==1])
[1] 25
length(v[v==2])
[1] 75
 

mais comme un one-liner plus général :) Quelque chose de proche (mais pas tout à fait) comme ceci:

 #<doesn't work right> length(v[v==unique(v)])
 

212voto

Chase Points 27342

Peut-être que la table est ce que vous recherchez?

 dummyData = rep(c(1,2, 2, 2), 25)


> table(dummyData)
dummyData
 1  2 
25 75

#or another presentation of the same data
> as.data.frame(table(dummyData))
  dummyData Freq
1     1   25
2     2   75
 

25voto

SeaSprite Points 1

Il s’agit d’une approche à une ligne utilisant aggregate .

 > aggregate(data.frame(count = v), list(value = v), length)

  value count
1     1    25
2     2    75
 

7voto

Ben Points 8166

Pour obtenir un vecteur entier non dimensionné contenant le nombre de valeurs uniques, utilisez c() .

 dummyData = rep(c(1, 2, 2, 2), 25) # Chase's reproducible data
c(table(dummyData)) # get un-dimensioned integer vector
 1  2 
25 75

str(c(table(dummyData)) ) # confirm structure
 Named int [1:2] 25 75
 - attr(*, "names")= chr [1:2] "1" "2"
 

Cela peut être utile si vous devez alimenter le nombre de valeurs uniques dans une autre fonction. Il est plus court et plus idiomatique que le t(as.data.frame(table(dummyData))[,2] affiché dans un commentaire de la réponse de Chase. Merci à Ricardo Saporta qui l’a signalé ici .

4voto

yoplait Points 113

Si vous avez besoin du nombre de valeurs uniques en tant que colonne supplémentaire dans le bloc de données contenant vos valeurs (une colonne pouvant représenter la taille de l'échantillon, par exemple), plyr fournit un moyen simple:

 data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))

library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))
 

0voto

user2771312 Points 1

Si vous voulez exécuter une tâche unique sur un data.frame (par exemple, train.data) et obtenir le nombre (qui peut être utilisé comme poids dans les classificateurs), vous pouvez procéder comme suit:

 unique.count = function(train.data, all.numeric=FALSE) {                                                                                                                                                                                                 
  # first convert each row in the data.frame to a string                                                                                                                                                                              
  train.data.str = apply(train.data, 1, function(x) paste(x, collapse=','))                                                                                                                                                           
  # use table to index and count the strings                                                                                                                                                                                          
  train.data.str.t = table(train.data.str)                                                                                                                                                                                            
  # get the unique data string from the row.names                                                                                                                                                                                     
  train.data.str.uniq = row.names(train.data.str.t)                                                                                                                                                                                   
  weight = as.numeric(train.data.str.t)                                                                                                                                                                                               
  # convert the unique data string to data.frame
  if (all.numeric) {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) as.numeric(unlist(strsplit(x, split=","))))))                                                                                                    
  } else {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) unlist(strsplit(x, split=",")))))                                                                                                    
  }
  names(train.data.uniq) = names(train.data)                                                                                                                                                                                          
  list(data=train.data.uniq, weight=weight)                                                                                                                                                                                           
}  
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X