使用 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 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()
?
我们可以做到
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()
考虑在此处创建 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()
?
我们可以做到
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()