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 uso group_by + mutate con n() :

    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.week

    Agrupar 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ón group_by para agrupar por semana o mes, y finalmente se utiliza summarise 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 y counts_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 paquete dplyr:

    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 datos y.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 paquete dplyr:

    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 datos y.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