recuento de entradas en el marco de datos en R
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!
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:
-
subconjusta el marco de datos original de acuerdo con el filtro suministrado (Creer == FALSO); entonces
-
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")