Compter le nombre d’éléments avec les valeurs de x dans un vecteur

J’ai un vecteur de nombres:

numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435, 453,435,324,34,456,56,567,65,34,435) 

Comment puis-je compter le nombre de fois qu’une valeur x apparaît dans le vecteur?

Vous pouvez simplement utiliser la table() :

 > a <- table(numbers) > a numbers 4 5 23 34 43 54 56 65 67 324 435 453 456 567 657 2 1 2 2 1 1 2 1 2 1 3 1 1 1 1 

Ensuite, vous pouvez le sous-ensembles:

 > a[names(a)==435] 435 3 

Ou convertissez-le en data.frame si vous êtes plus à l’aise avec cela:

 > as.data.frame(table(numbers)) numbers Freq 1 4 2 2 5 1 3 23 2 4 34 2 ... 

La manière la plus directe est la sum(numbers == x) .

numbers == x crée un vecteur logique qui est VRAI à chaque endroit où x se produit et, en sum , le vecteur logique est forcé à numeric, ce qui convertit TRUE en 1 et FALSE en 0.

Cependant, notez que pour les nombres à virgule flottante, il vaut mieux utiliser quelque chose comme: sum(abs(numbers - x) < 1e-6) .

Je ferais probablement quelque chose comme ça

 length(which(numbers==x)) 

Mais vraiment, une meilleure façon est

 table(numbers) 

Il y a aussi le count(numbers) de paquet plyr . Beaucoup plus pratique que la table à mon avis.

Ma solution préférée utilise rle , qui renverra une valeur (l’étiquette, x dans votre exemple) et une longueur, qui représente le nombre de fois où cette valeur est apparue dans l’ordre.

En combinant rle avec le sort , vous disposez d’un moyen extrêmement rapide pour compter le nombre de fois qu’une valeur est apparue. Cela peut être utile avec des problèmes plus complexes.

Exemple:

 > numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435) > a <- rle(sort(numbers)) > a Run Length Encoding lengths: int [1:15] 2 1 2 2 1 1 2 1 2 1 ... values : num [1:15] 4 5 23 34 43 54 56 65 67 324 ... 

Si la valeur souhaitée ne s’affiche pas ou si vous devez stocker cette valeur pour plus tard, créez un data.frame .

 > b <- data.frame(number=a$values, n=a$lengths) > b values n 1 4 2 2 5 1 3 23 2 4 34 2 5 43 1 6 54 1 7 56 2 8 65 1 9 67 2 10 324 1 11 435 3 12 453 1 13 456 1 14 567 1 15 657 1 

Je trouve rare que je veuille connaître la fréquence d’une valeur et pas toutes les valeurs, et rle semble être le moyen le plus rapide de compter et de stocker toutes les valeurs.

Il y a une fonction standard dans R pour cela

tabulate(numbers)

voici un moyen rapide et sale:

 x <- 23 length(subset(numbers, numbers==x)) 

Si vous voulez compter le nombre d’apparences par la suite, vous pouvez utiliser la fonction sapply :

 index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x])) cbind(numbers, index) 

Sortie:

  numbers index [1,] 4 1 [2,] 23 1 [3,] 4 2 [4,] 23 2 [5,] 5 1 [6,] 43 1 [7,] 54 1 [8,] 56 1 [9,] 657 1 [10,] 67 1 [11,] 67 2 [12,] 435 1 [13,] 453 1 [14,] 435 2 [15,] 324 1 [16,] 34 1 [17,] 456 1 [18,] 56 2 [19,] 567 1 [20,] 65 1 [21,] 34 2 [22,] 435 3 

Vous pouvez changer le numéro à ce que vous souhaitez dans la ligne suivante

 length(which(numbers == 4)) 
 numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435 453,435,324,34,456,56,567,65,34,435) > length(grep(435, numbers)) [1] 3 > length(which(435 == numbers)) [1] 3 > require(plyr) > df = count(numbers) > df[df$x == 435, ] x freq 11 435 3 > sum(435 == numbers) [1] 3 > sum(grepl(435, numbers)) [1] 3 > sum(435 == numbers) [1] 3 > tabulate(numbers)[435] [1] 3 > table(numbers)['435'] 435 3 > length(subset(numbers, numbers=='435')) [1] 3 

Un autre moyen que je trouve pratique est:

 numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435) (s<-summary (as.factor(numbers))) 

Cela convertit l'dataset en facteur, puis summary () nous donne les totaux de contrôle (nombre de valeurs uniques).

Le résultat est:

 4 5 23 34 43 54 56 65 67 324 435 453 456 567 657 2 1 2 2 1 1 2 1 2 1 3 1 1 1 1 

Cela peut être stocké en tant que dataframe si vous préférez.

as.data.frame (cbind (Number = noms (s), Freq = s), ssortingngsAsFactors = F, row.names = 1: longueur (s))

Ici, row.names a été utilisé pour renommer les noms de lignes. sans utiliser row.names, les noms de colonne dans s sont utilisés comme noms de ligne dans le nouveau dataframe

Le résultat est:

  Number Freq 1 4 2 2 5 1 3 23 2 4 34 2 5 43 1 6 54 1 7 56 2 8 65 1 9 67 2 10 324 1 11 435 3 12 453 1 13 456 1 14 567 1 15 657 1 

En utilisant la table mais sans comparer avec les names :

 numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435) x <- 67 numbertable <- table(numbers) numbertable[as.character(x)] #67 # 2 

table est utile lorsque vous utilisez plusieurs fois le nombre d'éléments différents. Si vous n'avez besoin que d'un compte, utilisez sum(numbers == x)