问题描述
请考虑在此处创建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
的“平均值”行在x轴上只有100个值;同样,ID == d
是GroupB
的最短值,因此GroupB
的“平均”时间序列在x轴(time
)上的长度为105个值。
我们该如何做到这一点(最好通过dplyr
管道)并将数据发送到ggplot()
?
解决方法
您可以尝试:
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()
,
我们可以做到
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))]))