Использование dplyr для усреднения групп временных рядов с индивидуумами разной длины

Aug 20 2020

Считайте datсозданные здесь:

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)

У нас есть данные временных рядов для 6 человек (6 IDс), которые принадлежат 2 группам ( GroupAи GroupB). Мы хотим построить линейный график, показывающий «средний» временной ряд обеих групп (так что будет две линии). Поскольку все индивиды имеют разную длину, нам нужно сделать dat%>%group_by(group)и отбросить значения после самого короткого IDв обеих группах. Другими словами, ID == aэто самый короткий в группе 1, поэтому «средняя» линия для GroupAбудет иметь длину только 100 значений по оси x; аналогично ID == dявляется самым коротким, GroupBпоэтому "средний" временной ряд GroupBбудет иметь длину 105 значений по оси x ( time). Как мы можем это сделать (желательно через dplyrпайп) и отправить данные по ggplot()адресу?

Ответы

4 AllanCameron Aug 20 2020 at 02:11

Вы можете попробовать:

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

Мы могли бы сделать

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