seleccionar - contar el número de filas en un marco de datos en R basado en el grupo
promedio de filas en r (8)
Aquí hay otra forma de usar aggregate
para contar filas por grupo:
my.data <- read.table(text = ''
month.year my.cov
Jan.2000 apple
Jan.2000 pear
Jan.2000 peach
Jan.2001 apple
Jan.2001 peach
Feb.2002 pear
'', header = TRUE, stringsAsFactors = FALSE, na.strings = NA)
rows.per.group <- aggregate(rep(1, length(my.data$month.year)),
by=list(my.data$month.year), sum)
rows.per.group
# Group.1 x
# 1 Feb.2002 1
# 2 Jan.2000 3
# 3 Jan.2001 2
Esta pregunta ya tiene una respuesta aquí:
- Contar el número de filas dentro de cada grupo 11 respuestas
Tengo un marco de datos en R
como este:
ID MONTH-YEAR VALUE
110 JAN. 2012 1000
111 JAN. 2012 2000
. .
. .
121 FEB. 2012 3000
131 FEB. 2012 4000
. .
. .
Por lo tanto, para cada mes de cada año hay n
filas y pueden estar en cualquier orden (es decir, no todas están en continuidad y están en pausas). Quiero calcular cuántas filas hay para cada MONTH-YEAR
es decir, cuántas filas hay para JAN. 2012, cuántos para FEB. 2012 y así sucesivamente. Algo como esto:
MONTH-YEAR NUMBER OF ROWS
JAN. 2012 10
FEB. 2012 13
MAR. 2012 6
APR. 2012 9
Traté de hacer esto:
n_row <- nrow(dat1_frame %.% group_by(MONTH-YEAR))
pero no produce la salida deseada. ¿Cómo puedo hacer eso?
Aquí hay un ejemplo que muestra cómo la table(.)
(O, más cercanamente coincidente con su salida deseada, data.frame(table(.))
Hace lo que parece que está pidiendo.
Tenga en cuenta también cómo compartir datos de muestra reproducibles de forma que otros puedan copiar y pegar en su sesión.
Aquí están los datos de muestra (reproducibles):
mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L),
MONTH.YEAR = c("JAN. 2012", "JAN. 2012",
"FEB. 2012", "FEB. 2012",
"MAR. 2012"),
VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)),
.Names = c("ID", "MONTH.YEAR", "VALUE"),
class = "data.frame", row.names = c(NA, -5L))
mydf
# ID MONTH.YEAR VALUE
# 1 110 JAN. 2012 1000
# 2 111 JAN. 2012 2000
# 3 121 FEB. 2012 3000
# 4 131 FEB. 2012 4000
# 5 141 MAR. 2012 5000
Aquí está el cálculo del número de filas por grupo, en dos formatos de visualización de salida:
table(mydf$MONTH.YEAR)
#
# FEB. 2012 JAN. 2012 MAR. 2012
# 2 2 1
data.frame(table(mydf$MONTH.YEAR))
# Var1 Freq
# 1 FEB. 2012 2
# 2 JAN. 2012 2
# 3 MAR. 2012 1
Intenta usar la función de conteo en dplyr:
library(dplyr)
dat1_frame %>%
count(MONTH.YEAR)
No estoy seguro de cómo obtuviste MES-AÑO como nombre de variable. Mi versión R no permite ese nombre de variable, así que lo reemplacé con MONTH.YEAR.
Como nota al margen, el error en su código fue que dat1_frame %.% group_by(MONTH-YEAR)
sin una función de summarise
devuelve el marco de datos original sin ninguna modificación. Entonces, quieres usar
dat1_frame %>%
group_by(MONTH.YEAR) %>%
summarise(count=n())
La función count()
en plyr
hace lo que quiere:
library(plyr)
count(mydf, "MONTH-YEAR")
Solo para completar la solución data.table:
library(data.table)
mydf <- structure(list(ID = c(110L, 111L, 121L, 131L, 141L),
MONTH.YEAR = c("JAN. 2012", "JAN. 2012",
"FEB. 2012", "FEB. 2012",
"MAR. 2012"),
VALUE = c(1000L, 2000L, 3000L, 4000L, 5000L)),
.Names = c("ID", "MONTH.YEAR", "VALUE"),
class = "data.frame", row.names = c(NA, -5L))
setDT(mydf)
mydf[, .(`Number of rows` = .N), by = MONTH.YEAR]
MONTH.YEAR Number of rows
1: JAN. 2012 2
2: FEB. 2012 2
3: MAR. 2012 1
Supongamos que tenemos un marco de datos df_data como se muestra a continuación
> df_data
ID MONTH-YEAR VALUE
1 110 JAN.2012 1000
2 111 JAN.2012 2000
3 121 FEB.2012 3000
4 131 FEB.2012 4000
5 141 MAR.2012 5000
Para contar el número de filas en df_data agrupadas por columna MONTH-YEAR, puede usar:
> summary(df_data$`MONTH-YEAR`)
FEB.2012 JAN.2012 MAR.2012
2 2 1
la función de resumen creará una tabla a partir del argumento factor, luego creará un vector para el resultado (líneas 7 y 8)
Utilizando el conjunto de datos de ejemplo que Ananda modificó, aquí hay un ejemplo que usa aggregate()
, que es parte del núcleo R. aggregate()
solo necesita algo para contar como función de los diferentes valores de MONTH-YEAR
. En este caso, utilicé VALUE
como lo que se debe contar:
aggregate(cbind(count = VALUE) ~ MONTH.YEAR,
data = mydf,
FUN = function(x){NROW(x)})
que te da ...
MONTH.YEAR count
1 FEB. 2012 2
2 JAN. 2012 2
3 MAR. 2012 1
library(plyr)
ddply(data, .(MONTH-YEAR), nrow)
Esto le dará la respuesta, si "MONTH-YEAR" es una variable. Primero, intente con unique (data $ MONTH-YEAR) y vea si devuelve valores únicos (sin duplicados).
Luego, por encima de simple split-apply-combine devolverá lo que está buscando.