es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener datos para un valor de 7 días o 10 días de antigüedad en R?

Estoy tratando de buscar un valor de 7 días atrás de los datos, pero no puedo filtrar el valor utilizando dplyr o base R.

“`{r}
library(nycflights13)
library(tidyverse)
library(lubridate)

nycflights13::flights %>%
mutate(date = ymd(paste(year,"-",month,"-",day))) %>%
dplyr::select(date, carrier, flight, origin, dest, arr_delay) %>%

group_by(carrier, flight, origin, dest) %>%
arrange(desc(date)) %>%

mutate(old_delay = .[.$date – 7, "arr_delay"])
# mutate(old_delay = . %>% filter(date – 7) %>% select(arr_delay))
“`

ERROR

Error: Problema con la columna old_delay en mutate().
i old_delay = .[.$date - 7, "arr_delay"].
x Se deben seleccionar las filas con un vector de subíndice válido.
x El subíndice i tiene el tipo incorrecto date.
i Debe ser lógico, numérico o de tipo character.
i El error ocurrió en el grupo 1: carrier = “9E”, flight = 2900, origin = “JFK”, dest = “BNA”.

¿Cómo puedo obtener los valores antiguos en una nueva columna? ¿Necesito usar apply dentro de mutate?

También he revisado el paquete zoo, donde se utilizan las ventanas de tiempo, pero no pude encontrar una función para obtener el valor exacto.

Resultado deseado:
nycflights puede que no sea un conjunto de datos adecuado para esto. Pero piense en esto como un conjunto de datos de acciones donde trato de encontrar el valor de cierre de la acción 7 días antes para poder calcular el cambio porcentual desde cada día hasta su valor antiguo de 7 días.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener un subconjunto de un valor hace 7 días a partir de los datos utilizando dplyr, puedes usar la función lag(). Así es cómo puedes modificar tu código para agregar una nueva columna llamada old_delay que contiene el valor de arr_delay de hace 7 días:

    “`{r}
    nycflights13::flights %>%
    mutate(date = ymd(paste(year,”-“,month,”-“,day))) %>%
    select(date, carrier, flight, origin, dest, arr_delay) %>%

    group_by(carrier, flight, origin, dest) %>%
    arrange(desc(date)) %>%

    mutate(old_delay = lag(arr_delay, 7))


    La función `lag()` devuelve el valor de una variable de una fila anterior en el marco de datos. Al especificar el número 7 como segundo argumento, le estamos indicando que devuelva el valor de hace 7 filas. Ten en cuenta que al utilizar `lag()` en combinación con `group_by()`, debes asegurarte de que el marco de datos esté ordenado por la variable de agrupación (`carrier`, `flight`, `origin` y `dest`) y la variable de tiempo (`date`) en el orden correcto. Por eso usamos `arrange(desc(date))` antes de llamar a `mutate()`. Con la columna `old_delay` agregada, ahora puedes calcular el cambio porcentual entre el `arr_delay` de cada día y su valor de hace 7 días utilizando el siguiente código: ```{r} nycflights13::flights %>% mutate(date = ymd(paste(year,"-",month,"-",day))) %>% select(date, carrier, flight, origin, dest, arr_delay) %>% group_by(carrier, flight, origin, dest) %>% arrange(date) %>% mutate(old_delay = lag(arr_delay, 7), change_pct = (arr_delay - old_delay) / old_delay * 100)

    Aquí, utilizamos arrange(date) en lugar de arrange(desc(date)) porque queremos que el marco de datos esté ordenado por fecha en orden ascendente. Luego, calculamos el cambio porcentual como (arr_delay - old_delay) / old_delay * 100 y almacenamos el resultado en una nueva columna llamada change_pct.

    ¡Espero que esto te ayude! Avísame si tienes más preguntas.

Comments are closed.