使用 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 个 ID
s)的时间序列数据,它们属于 2 个组(GroupA
和 GroupB
)。我们想要制作一个线图,显示两组的“平均”时间序列(所以会有两条线)。由于个体的长度不同,我们需要做dat%>%group_by(group)
,并在两组中最短的ID
之后剃掉值。换句话说,ID == a
是第 1 组中最短的,因此GroupA
的“平均”线在 x 轴上只有 100 个值;同样ID == d
是GroupB
的最短时间序列,因此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 %>% group_by(group, Time) %>% summarize(values = mean(values))
不同。可能是您在group_by(group)
之后需要slice
而不是mutate
@akrun 它只允许修剪末端,以便不表示任何没有完整 ID 集的时间。我认为dat %>% group_by(group, Time) %>% 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 对不同长度个体的时间序列组进行平均的主要内容,如果未能解决你的问题,请参考以下文章