Нахождение максимального числа из столбца для каждого дня целого года и создание графика до этого числа в R - PullRequest
0 голосов
/ 27 июня 2018

Есть база данных за весь год:

Month Day Time  X   Y
...
3      1    0   2   4
3      1    1   4   2
3      1    2   7   3
3      1    3   8   8
3      1    4   4   6
3      1    5   1   4
3      1    6   6   6
3      1    7   7   9
...
3      2    0   5   7
3      2    1   7   2
3      2    2   9   3
...
4      1    0   2   8
...

Я хочу найти максимальное значение X для каждого дня и создать график для каждого дня, начиная с начала дня (время 0) до этого найденного максимального значения. Я пытался использовать dataframe, но немного потерял и база данных довольно большая, поэтому я не уверен, что это лучшая идея.

Есть идеи как это сделать?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете попробовать tidyverse. Дублированные времена в день и месяц удаляются без какого-либо рейтинга.

library(tidyverse)
set.seed(123)
df <- data.frame(Month = sample(c(1:2), 30, replace = TRUE), 
                 Day = sample(c(1:2), 30, replace = TRUE), 
                 Time = sample(c(1:10), 30, replace = TRUE),
                 x = rnorm(30, mean = 10, sd = 5),
                 y = rnorm(30, mean = 10, sd = 5))

df %>%
  group_by(Month, Day) %>%
  filter(!duplicated(Time)) %>%  # remove dupliceted "Time"'s.  
  filter(x<=max(x) & Time <= Time[x == max(x)]) %>% 
  ggplot(aes(Time, x)) + 
   geom_line() + 
   geom_point(data=. %>% filter(x == max(x)))+ 
   facet_grid(Month~Day, labeller = label_both)

enter image description here

Или попробуйте собрать все в один сюжет, используя разные цвета

df %>%
  group_by(Month, Day) %>%
  filter(!duplicated(Time)) %>% 
  filter(x<=max(x) & Time <= Time[x == max(x)]) %>% 
  ggplot(aes(Time, x, color = interaction(Month, Day))) + 
   geom_line() + 
   geom_point(data=. %>% filter(x == max(x)))

enter image description here

0 голосов
/ 27 июня 2018

Если я вас правильно понял, это должно сработать:

Пример набора данных:

set.seed(123)
df <- data.frame(Month = sample(c(1:12), 30, replace = TRUE), 
                 Day = sample(c(1:31), 30, replace = TRUE), 
                 Time = sample(c(1:24), 30, replace = TRUE),
                 x = rnorm(30, mean = 10, sd = 5),
                 y = rnorm(30, mean = 10, sd = 5))

Использование tidyverse (ggplot и dplyr):

require(tidyverse)
df %>% 
  #Grouping by month and day
  group_by(Month, Day) %>% 
  #Creating new variables for x and y - the max value, and removing values bigger than the max value. 
  mutate(maxX = max(x, na.rm = TRUE), 
         maxY = max(y, na.rm = TRUE), 
         plotX = ifelse(x > maxY, NA, x), 
         plotY = ifelse(y > maxY, NA, y)) %>% 
  ungroup() %>%
  #Select and gather only the needed variables for the plot
  select(Time, plotX, plotY) %>% 
  gather(plot, value, -Time) %>%
  #Plot
  ggplot(aes(Time, value, color = plot)) + 
  geom_point()

вывод:

enter image description here

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