R: Número de observaciones dentro de un grupo
Usando el lenguaje de programación R, estoy tratando de seguir este tutorial aquí: Número de observaciones por día, mes y año en R
Creo datos a intervalos diarios y luego tomé sumas semanales de estos datos. Al archivo "y.week", quiero añadir una columna "contra" que enumera el número de observaciones en cada semana.
Aquí está el siguiente código que estoy usando:
#load libraries
library(xts)
library(ggplot2)
#create data
date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")
property_damages_in_dollars <- rnorm(731,100,10)
final_data <- data.frame(date_decision_made, property_damages_in_dollars)
#aggregate and count by week
y.week <-aggregate(property_damages_in_dollars~format(as.Date(date_decision_made),
format="%W-%y"),data=final_data, FUN=sum)
counts_week <- data.frame(table(as.Date(index(y.week))))
y.week$count = count_week
Pero no creo que esto sea correcto.
Entonces intenté hacer lo mismo por mes:
#aggregate and count by month
y.mon<-aggregate(property_damages_in_dollars~format(as.Date(date_decision_made),
format="%Y/%m"),data=final_data, FUN=sum)
counts_mon <- data.frame(table(as.Date(index(y.mon))))
y.mon$count = count_mon
Normalmente, habría utilizado la biblioteca "dplyr" para contar por grupo (contar por mes, contar por semana), pero no estoy seguro de cómo "tell" dplyr para considerar las observaciones en la misma semana (o en el mismo mes) como un "grupo".
¿Puede alguien por favor decirme qué estoy haciendo mal?
Gracias.
EDIT: Respuesta posible (proporcionada por Ronak Shah) :
Por semana:
date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")
property_damages_in_dollars <- rnorm(731,100,10)
final_data <- data.frame(date_decision_made, property_damages_in_dollars)
final_data %>%
mutate(date_decision_made = as.Date(date_decision_made)) %>%
group_by(week = format(date_decision_made, "%W-%y")) %>%
summarise( total = sum(property_damages_in_dollars, na.rm = TRUE), Count = n())
Por mes:
date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")
property_damages_in_dollars <- rnorm(731,100,10)
final_data <- data.frame(date_decision_made, property_damages_in_dollars)
final_data %>%
mutate(date_decision_made = as.Date(date_decision_made)) %>%
group_by(week = format(date_decision_made, "%Y-%m")) %>%
summarise( total = sum(property_damages_in_dollars, na.rm = TRUE), Count = n())
Pregunta hecha hace 3 años, 4 meses, 27 días - Por bitcraftsman
3 Respuestas:
-
Sería mejor si guardas objetos en su forma natural. Por ejemplo, mantener las fechas como fechas en lugar de cadena. Entonces puedes usar
library(dplyr) final_data %>% mutate(date_decision_made = as.Date(date_decision_made)) %>% add_count(week = format(date_decision_made, "%W-%y"), name = 'Count')
Uso
add_count
es un atajo sobre el usogroup_by
+mutate
conn()
:final_data %>% mutate(date_decision_made = as.Date(date_decision_made)) %>% group_by(week = format(date_decision_made, "%W-%y")) %>% mutate(Count = n())
Respondida el Dec 19, 2020 a las 03:39 - por codervoyager
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando está en la forma en que estás intentando contar el número de observaciones en cada semana o mes en el dataframe "y.week" y "y.mon". Aquí te dejo una solución usando la biblioteca dplyr para contar por semana y por mes:
R library(dplyr)
Crear datos de ejemplo
set.seed(123) date_decision_made <- seq(as.Date("2014/01/01"), as.Date("2016/01/01"), by = "day") property_damages_in_dollars <- rnorm(731, 100, 10) final_data <- data.frame(date_decision_made, property_damages_in_dollars)Agrupar por semana y contar observaciones
final_data %>% mutate(week = format(date_decision_made, "%W-%y")) %>% group_by(week) %>% summarise(total = sum(property_damages_in_dollars, na.rm = TRUE), Count = n()) -> y.weekAgrupar por mes y contar observaciones
final_data %>% mutate(month = format(date_decision_made, "%Y-%m")) %>% group_by(month) %>% summarise(total = sum(property_damages_in_dollars, na.rm = TRUE), Count = n()) -> y.mon print(y.week) print(y.mon)En este código, primero se crea el dataframe de datos "final_data" con una columna de fechas y otra de valores. Después, se utiliza la función
mutate
de dplyr para crear una nueva columna que represente la semana o mes a la que pertenece cada observación. Luego, se utiliza la funcióngroup_by
para agrupar por semana o mes, y finalmente se utilizasummarise
para calcular la suma de los valores y el recuento de observaciones en cada grupo.Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 20, 2020 a las 03:37 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Problema 1: contar el número de observaciones en cada semana
El código proporcionado para contar el número de observaciones por semana no es correcto porque intenta unir dos marcos de datos diferentes (
y.week
ycounts_week
) basándose en algún tipo de índice común. Sin embargo, estos marcos de datos no comparten un índice común y, por lo tanto, la unión fallará.Solución:
Para contar el número de observaciones en cada semana correctamente utilizando R, puedes usar la función
count()
del paquetedplyr
:r library(dplyr) y.week <- y.week %>% group_by(week = format(as.Date(index(y.week)), "%W-%y")) %>% tally()
Esto creará una nueva columna llamada
n
en el marco de datosy.week
que contiene el número de observaciones en cada semana.Problema 2: contar el número de observaciones en cada mes
El código proporcionado para contar el número de observaciones por mes no es correcto por la misma razón que el código para el recuento semanal.
Solución:
Para contar el número de observaciones en cada mes correctamente utilizando R, puedes usar la función
count()
del paquetedplyr
:r y.mon <- y.mon %>% group_by(month = format(as.Date(index(y.mon)), "%Y/%m")) %>% tally()
Esto creará una nueva columna llamada
n
en el marco de datosy.mon
que contiene el número de observaciones en cada mes.Respondida el Dec 20, 2020 a las 03:42 - por Gemini
Votos positivos: 0 | Votos negativos: 0