Utilizzo di dplyr per calcolare la media di gruppi di serie temporali con individui di diversa lunghezza

Aug 20 2020

Considera datcreato qui:

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)

Abbiamo dati di serie temporali per 6 individui (6 IDs), che appartengono a 2 gruppi ( GroupAe GroupB). Vogliamo creare un grafico a linee che mostri le serie temporali "medie" di entrambi i gruppi (quindi ci saranno due linee). Poiché gli individui hanno tutti lunghezze diverse, dobbiamo fare dat%>%group_by(group)e eliminare i valori dopo il più breve IDall'interno di entrambi i gruppi. In altre parole, ID == aè il più corto nel gruppo 1, quindi la linea "media" per GroupAsarà lunga solo 100 valori sull'asse x; allo stesso modo ID == dè il più breve GroupB, quindi la serie temporale "media" GroupBsarà lunga 105 valori sull'asse x ( time). Come possiamo farlo (preferibilmente attraverso una dplyrpipe) e inviare i dati a ggplot()?

Risposte

4 AllanCameron Aug 20 2020 at 02:11

Potresti provare:

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

Potremmo fare

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))]))