Pregunta

Estoy buscando obtener un recuento para el siguiente marco de datos:

> 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 número de niños que creen. ¿Qué comando usaría para obtener esto?

(El marco de datos real es mucho más grande. Acabo de darle las primeras cuatro filas ...)

¡Gracias!

¿Fue útil?

Solución

Puede usar la tabla :

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 

Otros consejos

Pienso en esto como un proceso de dos pasos:

  1. subconjusta el marco de datos original de acuerdo con el filtro suministrado (Creer == FALSO); entonces

  2. obtener el recuento de filas de este subconjunto

Para el primer paso, la función subset es una buena manera de hacer esto (solo una alternativa al índice ordinario o notación ) .

Para el segundo paso, usaría dim o nrow

Una ventaja de usar el subconjunto : no tiene que analizar el resultado que devuelve para obtener el resultado que necesita, simplemente llame directamente a nrow .

así que en tu caso:

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

o envuelto en una función anónima :

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

>> fnx(Believe, TRUE)
      3

Aparte de nrow , dim también hará el trabajo. Esta función devuelve las dimensiones de un marco de datos (filas, columnas), por lo que solo necesita proporcionar el índice apropiado para acceder al número de filas:

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

Una respuesta al OP publicada antes de esta muestra el uso de una tabla de contingencia. No me gusta ese enfoque para el problema general como se recita en el OP. Aquí está la razón. De acuerdo, el problema general de ¿cuántas filas en este marco de datos tienen el valor x en la columna C? se puede responder usando una tabla de contingencia, así como usando un " filtrado " esquema (como en mi respuesta aquí). Si desea recuentos de filas para todos los valores para una variable de factor dada (columna), entonces una tabla de contingencia (llamando a table y pasando las columnas de interés) es la solución más sensata; sin embargo, el OP solicita el recuento de un valor particular en una variable de factor, no cuenta en todos los valores. Además del impacto en el rendimiento (puede ser grande, puede ser trivial, solo depende del tamaño del marco de datos y del contexto de la tubería de procesamiento en el que reside esta función). Y, por supuesto, una vez que se devuelve el resultado de la llamada a la tabla, todavía tiene que analizar desde ese resultado solo el recuento que desea.

Entonces, por eso, para mí, este es un problema de filtrado más que de tabla cruzada.

sum(Santa$Believe)

Puede hacer summary (santa $ Believe) y obtendrá el recuento de TRUE y FALSE

DPLYR hace esto realmente fácil.

x<-santa%>%
   count(Believe)

Si desea contar por grupo; por ejemplo, cuántos hombres v mujeres creen, simplemente agregue un group_by :

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

Una solución de una línea con data.table podría ser

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

usando sqldf encaja aquí:

library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
       GROUP BY Believe")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top