482 votes

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

C'est un problème simple, mais pour la vie de moi je ne trouve pas de réponse.

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)

Je veux R pour compter le nombre de fois qu'une valeur de "x" s'affiche dans le vecteur.

Toute aide?

613voto

Shane Points 40885

Vous pouvez simplement utiliser 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 sous-ensemble:

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

Ou de le convertir en données.cadre si vous êtes plus à l'aise avec ça:

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

313voto

hadley Points 33766

La façon la plus directe est - sum(numbers == x).

numbers == x crée une logique vecteur qui est VRAI à chaque emplacement que x se produit, et lorsqu' suming, la logique vecteur est contrainte numérique qui convertit VRAI 1 et FALSE à 0.

Toutefois, notez que pour les nombres à virgule flottante, il est préférable d'utiliser quelque chose comme: sum(abs(numbers - x) < 1e-6).

81voto

Jesse Points 139

Je serais probablement faire quelque chose comme ceci

length(which(numbers==x))

Mais vraiment, la meilleure voie est

table(numbers)

40voto

geotheory Points 1724

Il est également count(a) de package plyr

37voto

JBecker Points 399

Ma solution préférée utilise rle, qui permet de renvoyer une valeur (l'étiquette, x dans l'exemple) et d'une longueur, qui représente le nombre de fois que la valeur est apparu dans la séquence.

En combinant rle avec sort, vous avez une extrêmement rapide de la façon de compter le nombre de fois où toute valeur est apparu. 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 que vous souhaitez ne pas apparaître, ou vous avez besoin de stocker cette valeur pour la suite, a 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 que c'est rare que j'ai envie de connaître la fréquence d'une valeur et non pas toutes les valeurs, et rle semble être la façon la plus rapide de compter et de les stocker.

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