Domanda

Sto cercando di ottenere un conteggio per il seguente frame di dati:

> 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

del numero di bambini che credono. Quale comando dovrei usare per ottenere questo?

(Il frame di dati effettivo è molto più grande. Ti ho appena dato le prime quattro righe ...)

Grazie!

È stato utile?

Soluzione

Puoi usare la tabella :

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 

Altri suggerimenti

Penso a questo come un processo in due fasi:

  1. imposta il sottoinsieme del frame di dati originale in base al filtro fornito (Creda == FALSE); poi

  2. ottiene il conteggio delle righe di questo sottoinsieme

Per il primo passo, la funzione subset è un buon modo per farlo (solo un'alternativa all'indice ordinario o alla notazione parentesi ) .

Per il secondo passaggio, vorrei utilizzare dim o nuovi

Un vantaggio dell'utilizzo di sottoinsieme : non è necessario analizzare il risultato restituito per ottenere il risultato di cui hai bisogno, basta chiamare nrow direttamente su di esso.

quindi nel tuo caso:

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

o racchiuso in una funzione anonima :

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

>> fnx(Believe, TRUE)
      3

Oltre a nrow , anche dim farà il suo lavoro. Questa funzione restituisce le dimensioni di un frame di dati (righe, colonne), quindi è sufficiente fornire l'indice appropriato per accedere al numero di righe:

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

Una risposta all'OP pubblicata prima di questa mostra l'uso di una tabella di contingenza. Non mi piace quell'approccio per il problema generale come recitato nel PO. Ecco il motivo. Certo, al problema generale di quante righe in questo frame di dati hanno valore x nella colonna C? è possibile rispondere utilizzando una tabella di contingenza e utilizzando un "filtro" " schema (come nella mia risposta qui). Se vuoi il conteggio delle righe per tutti i valori per una determinata variabile (colonna), allora una tabella di contingenza (chiamando la tabella e passando le colonne di interesse) è la soluzione più sensata; tuttavia, l'OP richiede il conteggio di un particolare in una variabile fattore, non il conteggio tra tutti i valori. A parte l'hit di prestazioni (potrebbe essere grande, potrebbe essere banale, dipende solo dalle dimensioni del frame di dati e dal contesto della pipeline di elaborazione in cui risiede questa funzione). E ovviamente, una volta restituito il risultato dalla chiamata alla tabella, devi ancora analizzare da quel risultato solo il conteggio che desideri.

Ecco perché, per me, si tratta di un problema di filtro piuttosto che di campi incrociati.

sum(Santa$Believe)

Puoi fare il sommario (santa $ Believe) e otterrai il conteggio per TRUE e FALSE

DPLYR rende tutto molto semplice.

x<-santa%>%
   count(Believe)

Se volevi contare da un gruppo; per esempio, quanti uomini v credono le femmine, basta aggiungere un group_by :

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

Una soluzione a una riga con data.table potrebbe essere

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

usando sqldf si adatta qui:

library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
       GROUP BY Believe")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top