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 faire compter le nombre de fois qu'une valeur x apparaît dans le vecteur?

320
demandé sur epo3 2009-12-17 20:21:36
la source

12 ответов

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 

alors vous pouvez le sous-ensemble:

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

ou le convertir en données.cadre si vous êtes plus à l'aise de travailler avec cela:

> as.data.frame(table(numbers))
   numbers Freq
1        4    2
2        5    1
3       23    2
4       34    2
...
405
répondu Shane 2009-12-17 20:32:19
la source

le chemin le plus direct est sum(numbers == x) .

numbers == x crée un vecteur logique qui est vrai à chaque endroit où x se produit, et lorsque sum ing, le vecteur logique est contraint à numérique qui convertit vrai à 1 et faux à 0.

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

217
répondu hadley 2009-12-17 21:09:42
la source

je ferais probablement quelque chose comme ça

length(which(numbers==x))

mais vraiment, une meilleure façon est

table(numbers)
47
répondu Jesse 2009-12-17 20:55:16
la source

il y a aussi count(numbers) du paquet plyr . Beaucoup plus pratique que table à mon avis.

32
répondu geotheory 2016-08-24 17:58:46
la source

ma solution préférée utilise rle , qui retournera une valeur (l'étiquette, x dans votre exemple) et une longueur, qui représente combien de fois cette valeur est apparue dans l'ordre.

en combinant rle avec sort , vous avez un moyen extrêmement rapide de compter le nombre de fois qu'une valeur est apparue. Cela peut être utile pour 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 vous ne voulez pas apparaître, ou vous devez stocker cette valeur pour plus tard, faire a a 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 qu'il est 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 pour obtenir compter et stocker tous.

31
répondu JBecker 2012-12-14 01:43:28
la source

il y a une fonction standard dans R pour que

tabulate(numbers)

16
répondu Sergej Andrejev 2012-04-19 17:13:15
la source

voici un rapide et sale:

x <- 23
length(subset(numbers, numbers==x))
8
répondu JD Long 2009-12-17 20:27:54
la source

si vous voulez compter le nombre d'apparitions 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
8
répondu Berny 2015-05-15 15:35:40
la source

vous pouvez changer le nombre à tout ce que vous voulez dans la ligne suivante

length(which(numbers == 4))
6
répondu uttkarsh dharmadhikari 2016-02-19 07:31:34
la source
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
5
répondu ishandutta2007 2017-06-07 16:22:04
la source

une autre façon 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)))

convertit l'ensemble de données en facteur, puis summary() nous donne les totaux de contrôle (décompte des valeurs uniques).

sortie:

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é comme dataframe si préféré.

as.données.frame (cbind (Number = names(s), Freq = s), stringsafactors=F, row.names = 1: length (s))

ici ligne.noms a été utilisé pour renommer les noms de lignes. sans l'aide de la ligne.les noms, les noms de colonnes en s sont utilisés comme noms de lignes dans la nouvelle dataframe

sortie:

     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
2
répondu Akash 2014-12-26 10:11:31
la source

utilisant le tableau mais sans comparaison avec 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 le compte de différents éléments à plusieurs reprises. Si vous n'avez besoin que d'un seul comptage, utilisez sum(numbers == x)

2
répondu pomber 2014-12-26 20:18:14
la source

Autres questions sur