Utilizzo di dplyr per calcolare la media di gruppi di serie temporali con individui di diversa lunghezza
Considera dat
creato 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 ID
s), che appartengono a 2 gruppi ( GroupA
e 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 ID
all'interno di entrambi i gruppi. In altre parole, ID == a
è il più corto nel gruppo 1, quindi la linea "media" per GroupA
sarà lunga solo 100 valori sull'asse x; allo stesso modo ID == d
è il più breve GroupB
, quindi la serie temporale "media" GroupB
sarà lunga 105 valori sull'asse x ( time
). Come possiamo farlo (preferibilmente attraverso una dplyr
pipe) e inviare i dati a ggplot()
?
Risposte
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()
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))]))