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つのグループ(GroupAおよびGroupB)に属する6人の個人(6秒)の時系列データがあります。両方のグループの「平均」時系列を示す折れ線グラフを作成します(したがって、2本の線があります)。個人の長さはすべて異なるため、両方のグループ内でdat%>%group_by(group)最短の値の後に値を削り取る必要がありIDます。つまり、ID == aはグループ1の中で最も短いので、の「平均」線GroupAはx軸上で100個の値のみになります。同様にID == dが最短であるGroupBため、の「平均」時系列はGroupBx軸(time)で105値の長さになります。どうすればこれを(できれば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))]))