Question

Je souhaite obtenir un compte pour le bloc de données suivant:

> 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?

(Le cadre de données réel est beaucoup plus grand. Je viens de vous donner les quatre premières lignes ...)

Merci!

Était-ce utile?

La solution

Vous pouvez utiliser la 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 

Autres conseils

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

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

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

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

Pour la deuxième étape, j'utiliserais dim ou nrow

L'un des avantages de l'utilisation de sous-ensemble : vous n'avez pas à analyser le résultat renvoyé pour obtenir le résultat souhaité - il vous suffit d'appeler directement nrow .

donc dans votre cas:

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

ou encapsulé dans une fonction anonyme :

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

>> fnx(Believe, TRUE)
      3

Hormis nrow , dim fera également l'affaire. Cette fonction renvoie les 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, telle qu’elle est décrite dans le PO. Voici la raison. Certes, le problème général de combien de lignes dans ce bloc de données ont la valeur x dans la colonne C? peut être résolu en utilisant un tableau de contingence ainsi qu’en utilisant un "filtrage" régime (comme dans ma réponse ici). Si vous voulez un nombre de lignes pour toutes les valeurs d'une variable factorielle donnée (colonne), alors un tableau de contingence (en appelant la table et en transmettant 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 simplement 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 analyser à 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é.

sum(Santa$Believe)

Vous pouvez créer summary (santa $ Believe) et vous obtiendrez le décompte pour TRUE et FALSE

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)

Une solution sur une ligne avec data.table pourrait être

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

utiliser sqldf correspond ici:

library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
       GROUP BY Believe")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top