Как сгруппировать и разделить распределения в ggplot [например, сломать geom_line ()] - PullRequest
0 голосов
/ 29 октября 2018
   date       value grp       MR MR.avg   avg   lcl   ucl
   <date>     <dbl> <chr>  <dbl>  <dbl> <dbl> <dbl> <dbl>
 1 2009-07-07 11.6  A     NA      1.15  10.2  13.3  7.18 
 2 2009-07-08 10.1  A      1.51   1.15  10.2  13.3  7.18 
 3 2009-07-09 11.4  A      1.39   1.15  10.2  13.3  7.18 
 4 2009-07-10 10.5  A      0.932  1.15  10.2  13.3  7.18 
 5 2009-07-11  9.27 A      1.24   1.15  10.2  13.3  7.18 
 6 2009-07-12  9.95 A      0.688  1.15  10.2  13.3  7.18 
 7 2009-07-13 10.6  A      0.598  1.15  10.2  13.3  7.18 
 8 2009-07-14 10.1  A      0.415  1.15  10.2  13.3  7.18 
 9 2009-07-15  8.48 A      1.66   1.15  10.2  13.3  7.18 
10 2009-07-16 10.4  A      1.90   1.15  10.2  13.3  7.18 
11 2009-07-17  2.72 B     NA      0.832  2.83  5.05 0.623
12 2009-07-18  1.44 B      1.27   0.832  2.83  5.05 0.623
13 2009-07-19  2.23 B      0.782  0.832  2.83  5.05 0.623
14 2009-07-20  3.03 B      0.809  0.832  2.83  5.05 0.623
15 2009-07-21  3.21 B      0.176  0.832  2.83  5.05 0.623

Line 8 моего кода ниже группирует каждое из трех распределений в одну из трех групп - «A», «B» или «C». Затем я перехожу к графику трех распределений с контрольными пределами , как показано далеко ниже.

library(tidyverse)
set.seed(55)

df <- tibble(
  date = as.Date(40001:40030, origin = "1899-12-30"), 
  value = c(rnorm(10, 10), rnorm(10, 3), rnorm(10, 7))
  ) %>% 
  mutate(grp = c(rep("A", 10), rep("B", 10), rep("C", 10))) %>%  # line 8
  group_by(grp) %>% 
  mutate(
    MR = abs(lag(value, 1) - value), 
    MR.avg = sum(MR, na.rm = TRUE) / (n() - 1), 
    avg = mean(value), 
    lcl = avg + (2.66 * MR.avg), 
    ucl = avg - (2.66 * MR.avg), 
  ) %>% 
  print(n = 15)

p <- ggplot(df, aes(date, value, group = grp)) + 
  geom_line() + 
  geom_line(aes(date, lcl)) + 
  geom_line(aes(date, ucl))
p

Я взываю line 8 специально выше, с комментарием. Как видите, line 8 - это ручной процесс, который я хочу упростить с помощью аргумента split(). Я хотел бы иметь возможность просто указать точку разделения, в данном случае 10-й / 11-й ряд и 20-й / 21-й ряд, с синтаксисом, который, я думаю, напоминает split(c(10, 20)) или, возможно, split(c(11, 21)). Как правильно применить split() или какую-либо другую функцию, подходящую для замены строки 8 чем-то лучшим?

Немного предыстории ... Я пишу это как функцию, и мне нужно предоставить пользователю простой интерфейс, в сущности что-то вроде split(c(point1, point2, etc)), чтобы позволить пользователю разделять распределения на контрольной диаграмме . .

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...