web-dev-qa-db-fra.com

Comment compter combien de valeurs par niveau dans un facteur donné?

J'ai un data.frame mydf avec environ 2500 lignes. Ces lignes correspondent à 69 classes d'objets dans la colonne 1 mydf$V1, et je veux compter le nombre de lignes que j'ai par classe d'objet. Je peux avoir un facteur de ces classes avec:

objectclasses = unique(factor(mydf$V1, exclude="1"));

Quelle est la façon la plus rapide de compter les lignes par classe d'objet? Si c'était un autre langage, je parcourrais un tableau avec une boucle et je comptais, mais je suis nouveau en programmation R et j'essaie de tirer parti des opérations vectorisées de R.

27
Escher

Ou en utilisant la bibliothèque dplyr:

library(dplyr)
set.seed(1)
dat <- data.frame(ID = sample(letters,100,rep=TRUE))
dat %>% 
  group_by(ID) %>%
  summarise(no_rows = length(ID))

Notez l'utilisation de %>%, qui est similaire à l'utilisation de tuyaux dans bash. Effectivement, le code ci-dessus canalise dat dans group_by, et le résultat de cette opération est transféré dans summarise.

Le résultat est:

Source: local data frame [26 x 2]

   ID no_rows
1   a       2
2   b       3
3   c       3
4   d       3
5   e       2
6   f       4
7   g       6
8   h       1
9   i       6
10  j       5
11  k       6
12  l       4
13  m       7
14  n       2
15  o       2
16  p       2
17  q       5
18  r       4
19  s       5
20  t       3
21  u       8
22  v       4
23  w       5
24  x       4
25  y       3
26  z       1

Voir dplyr introduction pour un peu plus de contexte et la documentation pour plus de détails sur les fonctions individuelles.

40
Paul Hiemstra

Voici 2 façons de le faire:

set.seed(1)
tt <- sample(letters,100,rep=TRUE)

## using table
table(tt)
tt
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 
## using tapply
tapply(tt,tt,length)
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 
31
agstudy

Utilisation du package plyr:

library(plyr)

count(mydf$V1)

Il vous retournera une fréquence de chaque valeur.

21
Andriy T.

En utilisant data.table

 library(data.table)
 setDT(dat)[, .N, keyby=ID] #(Using @Paul Hiemstra's `dat`)

Ou en utilisant dplyr 0.3

 res <- count(dat, ID)
 head(res)
 #Source: local data frame [6 x 2]

 #  ID n
 #1  a 2
 #2  b 3
 #3  c 3
 #4  d 3
 #5  e 2
 #6  f 4

Ou

  dat %>% 
      group_by(ID) %>% 
      tally()

Ou

  dat %>% 
      group_by(ID) %>%
      summarise(n=n())
15
akrun

Nous pouvons utiliser la colonne de facteur summary sur:

summary(myDF$factorColumn)
5
Spariant

Une autre approche consisterait à appliquer la fonction n()) qui compte le nombre d'observations

library(dplyr)
library(magrittr)
data %>% 
  group_by(columnName) %>%
  summarise(Count = n())
4
iamigham

Utilisez le paquet plyr avec lapply pour obtenir des fréquences pour chaque valeur (niveau) et chaque variable (facteur) de votre trame de données.

library(plyr)
lapply(df, count)
1

Si je veux juste savoir combien de niveaux de facteurs uniques existent dans les données, j'utilise:

length(unique(df$factorcolumn))
0
Peter