Uso de dplyr para promediar grupos de series de tiempo con individuos de diferentes longitudes

Aug 20 2020

Considere datcreado aquí:

set.seed(123)
ID = factor(letters[seq(6)])
time = c(100, 102, 120, 105, 109, 130)
dat <- data.frame(ID = rep(ID,time), Time = sequence(time))
dat$group <- rep(c("GroupA","GroupB"), c(322,344))

dat$values <- sample(100, nrow(dat), TRUE)

Tenemos datos de series de tiempo para 6 individuos (6 IDs), que pertenecen a 2 grupos ( GroupAy GroupB). Queremos hacer un diagrama de líneas que muestre la serie de tiempo "promedio" de ambos grupos (por lo que habrá dos líneas). Dado que todos los individuos tienen diferentes longitudes, debemos hacer dat%>%group_by(group)y eliminar los valores después del más corto IDdentro de ambos grupos. En otras palabras, ID == aes el más corto del grupo 1, por lo que la línea "promedio" GroupAsolo tendrá 100 valores de largo en el eje x; igualmente ID == des el más corto para GroupBque la serie de tiempo "promedio" de GroupBserá de 105 valores de largo en el eje x ( time). ¿Cómo podemos hacer esto (preferiblemente a través de una dplyrtubería) y enviar los datos a ggplot()?

Respuestas

4 AllanCameron Aug 20 2020 at 02:11

Tu podrías intentar:

library(ggplot2)
library(dplyr)

dat %>% 
  group_by(ID) %>%
  mutate(maxtime = max(Time)) %>%
  group_by(group) %>%
  mutate(maxtime = min(maxtime)) %>%
  group_by(group, Time) %>%
  summarize(values = mean(values)) %>%
  ggplot(aes(Time, values, colour = group)) + geom_line()

2 akrun Aug 20 2020 at 02:07

Podríamos hacer

library(dplyr)
dat %>% 
   add_count(group, ID) %>%
   group_by(group) %>%
   mutate(n = min(n)) %>%
   group_by(group, ID) %>% 
   summarise(values = mean(values[seq_len(first(n))]))