web-dev-qa-db-fra.com

nombre d'entrées dans la trame de données en R

Je cherche à obtenir un compte pour la trame de données suivante:

> Santa
   Believe Age Gender Presents Behaviour
1    FALSE   9   male       25   naughty
2     TRUE   5   male       20      Nice
3     TRUE   4 female       30      Nice
4     TRUE   4   male       34   naughty

du nombre d'enfants qui croient. Quelle commande utiliserais-je pour l'obtenir?

(La trame de données réelle est beaucoup plus grande. Je viens de vous donner les quatre premières lignes ...)

Merci!

24
Michael

Vous pouvez utiliser table:

R> x <- read.table(textConnection('
   Believe Age Gender Presents Behaviour
1    FALSE   9   male       25   naughty
2     TRUE   5   male       20      Nice
3     TRUE   4 female       30      Nice
4     TRUE   4   male       34   naughty'
), header=TRUE)

R> table(x$Believe)

FALSE  TRUE 
    1     3 
37
rcs

Je pense à cela comme un processus en deux étapes: 

  1. sous-ensemble de la trame de données d'origine en fonction du filtre fourni (Croire == FAUX); puis

  2. obtenir le nombre de lignes de ce sous-ensemble

Pour la première étape, la fonctionsous-ensembleest un bon moyen de le faire (juste une alternative à l'index ordinaire ou à la notation crochet).

Pour la deuxième étape, je voudrais utiliserdimounrow

Un des avantages de subset: vous n'avez pas à analyser le résultat renvoyé pour obtenir le résultat souhaité - il vous suffit d'appeler directement nrow.

alors dans votre cas:

v = nrow(subset(Santa, Believe==FALSE))     # 'subset' returns a data.frame

ou encapsulé dans une fonction anonymous:

>> fnx = function(fac, lev){nrow(subset(Santa, fac==lev))}

>> fnx(Believe, TRUE)
      3

En plus de nrow, dim fera également l'affaire. Cette fonction renvoie le dimensions d'un cadre de données (lignes, colonnes). Il vous suffit donc de fournir l'index approprié pour accéder au nombre de lignes: 

v = dim(subset(Santa, Believe==FALSE))[1] 

Une réponse au PO postée avant celle-ci montre l'utilisation d'un tableau de contingence. Je n’aime pas cette approche pour le problème général tel qu’il est décrit dans le PO. Voici la raison. Certes, le problème général de combien de lignes dans ce cadre de données ont la valeur x dans la colonne C? Il est possible de répondre à en utilisant un tableau de contingence et en utilisant un schéma de "filtrage" (comme dans ma réponse ici). Si vous voulez un nombre de lignes pour toutes les valeurs d'une variable factorielle donnée (colonne), un tableau de contingence (via l'appel de table et en passant par la ou les colonnes d'intérêt) est la solution la plus judicieuse. Cependant, l'OP demande le décompte d'une valeur particulière dans une variable facteur, mais pas le décompte pour toutes les valeurs. Mis à part l'impact négatif sur les performances (il peut être volumineux, trivial, cela dépend uniquement de la taille du bloc de données et du contexte du pipeline de traitement dans lequel réside cette fonction). Et bien sûr, une fois que le résultat de l'appel à table est renvoyé, vous devez toujours parse à partir de ce résultat, uniquement le nombre souhaité. 

C’est pourquoi, pour moi, il s’agit d’un problème de filtrage plutôt que de problème de tableau croisé.

22
doug
sum(Santa$Believe)
14
Carl

Vous pouvez faire summary(santa$Believe) et vous obtiendrez le compte pour TRUE et FALSE

2
Brenda D'Acunha

Un une ligne solution avec data.table pourrait être

library(data.table)
setDT(x)[,.N,by=Believe]
   Believe N
1:   FALSE 1
2:    TRUE 3
0
Chriss Paul

DPLYR rend cela vraiment facile. 

x<-santa%>%
   count(Believe)

Si vous vouliez compter par un groupe; par exemple, combien de personnes de sexe masculin/féminin croient, ajoutez simplement un group_by:

x<-santa%>%
   group_by(Gender)%>%
   count(Believe)
0
Joe