การใช้ 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)

เรามีข้อมูลอนุกรมเวลาสำหรับ 6 บุคคล (6 IDวินาที) ซึ่งเป็นของ 2 กลุ่ม ( GroupAและGroupB) เราต้องการสร้างพล็อตเส้นที่แสดงอนุกรมเวลา "เฉลี่ย" ของทั้งสองกลุ่ม (จะมีสองบรรทัด) เนื่องจากแต่ละคนมีความยาวต่างกันเราจึงจำเป็นต้องทำdat%>%group_by(group)และกำจัดค่านิยมหลังจากที่สั้นที่สุดIDในทั้งสองกลุ่ม กล่าวอีกนัยหนึ่งID == aคือสั้นที่สุดในกลุ่ม 1 ดังนั้นเส้น "ค่าเฉลี่ย" สำหรับGroupAจะยาวเพียง 100 ค่าบนแกน x ในทำนองเดียวกันID == dจะสั้นที่สุดGroupBดังนั้นอนุกรมเวลา "เฉลี่ย" GroupBจะยาว 105 ค่าบนแกน 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))]))