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

Posted

技术标签:

【中文标题】使用 dplyr 对不同长度个体的时间序列组进行平均【英文标题】:Using dplyr to average time series groups with individuals of different lengths 【发布时间】:2020-12-09 02:18:50 【问题描述】:

考虑在此处创建的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%&gt;%group_by(group),并在两组中最短的ID之后剃掉值。换句话说,ID == a 是第 1 组中最短的,因此GroupA 的“平均”线在 x 轴上只有 100 个值;同样ID == dGroupB 的最短时间序列,因此GroupB 的“平均”时间序列在x 轴上将是105 个值(time)。 我们如何做到这一点(最好通过dplyr 管道)并将数据发送到ggplot()

【问题讨论】:

听起来您正在寻找滚动窗口平均值。您是否考虑过签出slider 包或使用zoo 中的rollapply 来完成? @akrun 谢谢我知道你要去哪里,你的回答也很有帮助。当我复制它时错过了创建响应变量的行,这对我不利 【参考方案1】:

你可以试试:

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

【讨论】:

感谢您指出这一点,我从 R 复制此内容时遗漏了一行。我将您的值添加到问题中,这样您就不必修改答案。 谢谢@Ryan。我将删除答案中的标题 不清楚为什么这与dat %&gt;% group_by(group, Time) %&gt;% summarize(values = mean(values))不同。可能是您在group_by(group) 之后需要slice 而不是mutate @akrun 它只允许修剪末端,以便不表示任何没有完整 ID 集的时间。我认为dat %&gt;% group_by(group, Time) %&gt;% summarize(values = mean(values)) 会在最短 ID 完成后保留每个组中的值,这是 OP 不想要的。【参考方案2】:

我们可以做

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

【讨论】:

以上是关于使用 dplyr 对不同长度个体的时间序列组进行平均的主要内容,如果未能解决你的问题,请参考以下文章

使用 dplyr 对多列进行不同操作的汇总

dplyr:根据不同条件分组,然后返回top n

如何使用 dplyr 在行组之间进行划分?

使用dplyr汇总多个列的不同操作

使用 dplyr 包按时间平均 - R

使用 dplyr 按 R 中的组比较平均值(ANOVA)