使用 dplyr 对具有不同长度的个体的时间序列组进行平均

Using dplyr to average time series groups with individuals of different lengths

考虑在此处创建 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 IDs)的时间序列数据,它们属于 2 个组(GroupAGroupB)。我们想制作一个线图来显示两组的“平均”时间序列(因此会有两条线)。由于个体的长度都不同,我们需要做 dat%>%group_by(group),并在两组中最短的 ID 之后削减值。换句话说,ID == a 是组 1 中最短的,因此 GroupA 的“平均”线在 x 轴上的长度仅为 100 个值;同样,ID == dGroupB 的最短时间序列,因此 GroupB 的“平均”时间序列在 x 轴上的长度为 105 个值 (time)。 我们如何做到这一点(最好通过 dplyr 管道)并将数据发送到 ggplot()?

我们可以做到

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

你可以试试:

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