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 où une valeur x apparaît dans le vecteur?
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 le sous-définir:
> a[names(a)==435]
435
3
Ou convertissez-le en un 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
...
a["435"]
têtea[names(a)==435]
?Le moyen le plus direct est
sum(numbers == x)
.numbers == x
crée un vecteur logique qui est VRAI à chaque emplacement où x se produit, et lors de l'sum
ing, le vecteur logique est contraint en numérique qui convertit VRAI en 1 et FAUX en 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)
.la source
x
dans les données plutôt qu'une valeur connue spécifique dex
. Pour être juste, c'était sur cela que portait la question initiale. Comme je l'ai dit dans ma réponse ci-dessous, "Je trouve qu'il est rare que je veuille connaître la fréquence d'une valeur et pas toutes les valeurs ..."Je ferais probablement quelque chose comme ça
Mais vraiment, une meilleure façon est
la source
table(numbers)
va faire beaucoup plus de travail que la solution la plus simplesum(numbers==x)
, car elle va aussi comprendre le nombre de tous les autres nombres de la liste.Il y a aussi
count(numbers)
duplyr
package. Beaucoup plus pratique qu'àtable
mon avis.la source
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 en séquence.En combinant
rle
avecsort
, 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:
Si la valeur souhaitée n'apparaît pas ou si vous devez la stocker pour plus tard, faites
a
undata.frame
.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 le comptage et les stocker toutes.
la source
c(rep('A', 3), rep('G', 4), 'A', rep('G', 2), rep('C', 10))
reviendraitvalues = c('A','G','A','G','C')
etlengths=c(3, 4, 1, 2, 10)
qui est parfois utile.table
c'est plus rapidewhen the vector is long
(j'ai essayé 100000) mais légèrement plus long quand il est plus court (j'ai essayé 1000)Il y a une fonction standard dans R pour cela
tabulate(numbers)
la source
tabulate
est que vous ne pouvez pas gérer les nombres nuls et négatifs.tabulate
. Note:sort
semble être nécessaire pour son utilisation correcte en général:tabulate(sort(numbers))
.la source
voici une façon rapide et sale:
la source
Si vous souhaitez compter le nombre d'apparitions ultérieurement, vous pouvez utiliser la
sapply
fonction:Production:
la source
Vous pouvez changer le nombre en ce que vous souhaitez dans la ligne suivante
la source
Une autre façon que je trouve pratique est:
Cela convertit l'ensemble de données en facteur, puis summary () nous donne les totaux de contrôle (décompte des valeurs uniques).
La sortie est:
Cela peut être stocké en tant que trame de données si vous préférez.
ici row.names a été utilisé pour renommer les noms de ligne. sans utiliser row.names, les noms de colonne en s sont utilisés comme noms de ligne dans la nouvelle trame de données
La sortie est:
la source
En utilisant le tableau mais sans comparer avec
names
:table
est utile lorsque vous utilisez plusieurs fois le nombre d'éléments différents. Si vous n'avez besoin que d'un seul comptage, utilisezsum(numbers == x)
la source
Il existe différentes façons de compter un élément spécifique
la source
Une méthode qui est relativement rapide sur les vecteurs longs et qui donne une sortie pratique est à utiliser
lengths(split(numbers, numbers))
(notez le S à la fin delengths
):La sortie est simplement un vecteur nommé.
La vitesse semble comparable à celle
rle
proposée par JBecker et même un peu plus rapide sur de très longs vecteurs. Voici une microbenchmark dans R 3.6.2 avec certaines des fonctions proposées:Surtout, la seule fonction qui compte également le nombre de valeurs manquantes
NA
estplyr::count
. Ceux-ci peuvent également être obtenus séparément en utilisantsum(is.na(vec))
la source
Il s'agit d'une solution très rapide pour les vecteurs atomiques unidimensionnels. Il repose sur
match()
, il est donc compatible avecNA
:Vous pouvez également modifier l'algorithme pour qu'il ne s'exécute pas
unique()
.Dans les cas où cette sortie est souhaitable, vous n'en avez probablement même pas besoin pour renvoyer le vecteur d'origine, et la deuxième colonne est probablement tout ce dont vous avez besoin. Vous pouvez obtenir cela en une seule ligne avec le tuyau:
la source
Cela peut être fait avec
outer
pour obtenir une métrique des égalités suivierowSums
d'une signification évidente.Afin d'avoir les
numbers
nombres et dans le même ensemble de données, un data.frame est d'abord créé. Cette étape n'est pas nécessaire si vous souhaitez une entrée et une sortie distinctes.la source