conteggio delle voci nel frame di dati in R
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!
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:
-
imposta il sottoinsieme del frame di dati originale in base al filtro fornito (Creda == FALSE); poi
-
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")