dplyr을 사용하여 길이가 다른 개인의 평균 시계열 그룹

Aug 20 2020

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)

ID2 개의 그룹 ( GroupAGroupB)에 속하는 6 명의 개인 (6 초)에 대한 시계열 데이터가 있습니다. 두 그룹의 "평균"시계열을 표시하는 선 플롯을 만들려고합니다 (따라서 두 개의 선이 있음). 개인은 모두 길이가 다르기 때문에 두 그룹 내 dat%>%group_by(group)에서 가장 짧은 값 이후에 값을 깎아야합니다 ID. 즉, ID == a은 그룹 1에서 가장 짧으므로에 대한 "평균"라인 GroupA은 x 축에서 100 개의 값만됩니다. 마찬가지로 ID == d위한 최단 GroupB의 "평균"시계열 너무 GroupB105 개 값 긴 X 축 (것 time). 이 작업을 수행하고 (가급적이면 dplyr파이프를 통해 ) 데이터를 ggplot()어떻게 보낼 수 있습니까?

답변

4 AllanCameron Aug 20 2020 at 02:11

시도해 볼 수 있습니다.

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

2 akrun Aug 20 2020 at 02:07

우리는 할 수 있습니다

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