как накопить несколько столбцов data.frame в R? - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь найти накопленные значения для каждого года переменных A to Z в myData. Я попробовал несколько вещей, но не смог. Как только я это сделаю, мне нужно будет вычислить maximum,minimum, median, upper and lower quartile среднее значение за все эти годы. Вот мой трудоемкий код, но пока я понятия не имею, как действовать дальше - на самом деле, текущий код также не дает мне того, что я хочу.

library(tidyverse)

mydate <- as.data.frame(seq(as.Date("2000-01-01"), to= as.Date("2019-12-31"), by="day"))
colnames(mydate) <- "Date"
Data <- data.frame(A = runif(7305,0,10), 
                   J = runif(7305,0,8), 
                   X = runif(7305,0,12), 
                   Z = runif(7305,0,10))
DF <- data.frame(mydate, Data)

myData <- DF %>% separate(Date, into = c("Year","Month","Day")) %>% 
   sapply(as.numeric) %>% 
   as.data.frame() %>% 
   mutate(Date = DF$Date) %>% 
   filter(Month > 4 & Month < 11) %>% 
   mutate(DOY = format(Date, "%j")) %>% 
   group_by(Year) %>% 
   mutate(cumulativeSum = accumulate(DOY))

Я пытаюсь получить Рисунок как ниже для A, J, X, Z. любая помощь будет оценена.

Обновление (РЕДАКТИРОВАТЬ)

Мой вопрос довольно запутанный, поэтому я решил разбить его на этапы, используя Excel. Здесь я использую только одну переменную, которая в данном случае A (примечание: в моем вопросе у меня есть несколько переменных). Я накапливаю данные с мая по октябрь каждого года, что отражено в столбце cumulative sum. На втором шаге (Step-2) я переставляю данные в день года (с мая по октябрь) с их данными. в step-3 я беру статистику, которую я упоминал ранее по всем годам, за каждый день года. Я пытаюсь уточнить как можно больше, но, возможно, это немного странный вопрос. enter image description here

Окончательный рисунок Вот пример рисунка, который я хотел бы получить в результате этого упражнения.

enter image description here

1 Ответ

1 голос
/ 10 марта 2020

Итак, если я хорошо понимаю, вы пытаетесь построить статистическое описание совокупных значений каждой переменной в период с мая по октябрь 2000 - 2019 гг.

Итак, вот возможное решение рассчитать первую описательную статистику каждой переменной (используя пакет dplyr, lubridate, tiydr) - я рекомендовал вам разбить этот код на несколько частей, чтобы понять все шаги.

Обычно я выделяю месяц и год даты, затем поворачиваю фрейм данных в более длинный формат, фильтрую для хранения значений только в течение интересующего периода (с мая по октябрь), вычисляю накопленную сумму сгруппированных значений. по переменным и году. Затем я создаю фиктивную дату (вставляя последовательный год с реальным месяцем и днями), чтобы рассчитать описательную статистику в зависимости от этой даты и переменной.

В целом, это дает что-то вроде этого:

library(lubridate)
library(dplyr)
library(tidyr)

mydata <- DF %>% mutate(Year = year(Date), Month = month(Date)) %>%
  pivot_longer(-c(Date,Year,Month), names_to = "variable", values_to = "values") %>% 
  filter(between(Month,5,10)) %>% 
  group_by(Year, variable) %>% 
  mutate(Cumulative = cumsum(values)) %>%
  mutate(NewDate = ymd(paste("2020", Month,day(Date), sep = "-"))) %>%
  ungroup() %>%
  group_by(variable, NewDate) %>%
  summarise(Median = median(Cumulative),
            Maximum = max(Cumulative),
            Minimum = min(Cumulative),
            Upper = quantile(Cumulative,0.75),
            Lower = quantile(Cumulative, 0.25))

Затем вы можете получить график, похожий на ваш пример, выполнив:

library(ggplot2)
ggplot(mydata, aes(x = NewDate))+
  geom_ribbon(aes(ymin = Lower, ymax = Upper), color = "grey", alpha =0.5)+
  geom_line(aes(y = Median), color = "darkblue")+
  geom_line(aes(y = Maximum), color = "red", linetype = "dashed", size = 1.5)+
  geom_line(aes(y = Minimum), color ="red", linetype = "dashed", size = 1.5)+
  facet_wrap(~variable, scales = "free")+
  scale_x_date(date_labels = "%b", date_breaks = "month", name = "Month")+
  ylab("Daily Cumulative Precipitation (mm)")

enter image description here

Выглядит ли то, что вы пытаетесь достичь?


РЕДАКТИРОВАТЬ: Добавление легенд

Добавление легенды здесь это не просто, так как вы используете разные geom (лента, линия) с другим цветом, формой, ...

Итак, один из способов - это перегруппировать статистику, которая может быть построена с одинаковыми geom и do:

mydata %>% pivot_longer(cols = c(Median, Minimum,Maximum), names_to = "Statistic",values_to = "Value") %>%
  ggplot(aes(x = NewDate))+
  geom_ribbon(aes(ymin = Lower, ymax = Upper, fill = "Upper / Lower"), alpha =0.5)+
  geom_line(aes(y = Value, color = Statistic, linetype = Statistic, size = Statistic))+
  facet_wrap(~variable, scales = "free")+
  scale_x_date(date_labels = "%b", date_breaks = "month", name = "Month")+
  ylab("Daily Cumulative Precipitation (mm)")+
  scale_size_manual(values = c(1.5,1,1.5))+
  scale_linetype_manual(values = c("dashed","solid","dashed"))+
  scale_color_manual(values = c("red","darkblue","red"))+
  scale_fill_manual(values = "grey", name = "")

enter image description here

Итак, это выглядит хорошо, но, как вы можете видеть, это немного странно, так как верхний / нижний немного выдвинут из основных легенд.

Другим решением является добавление условных обозначений в качестве надписей на последнюю дату. Для этого вы можете создать второй фрейм данных, указав только последнюю дату вашего первого фрейма данных:

mydata_label <- mydata %>% filter(NewDate == max(NewDate)) %>% 
  pivot_longer(cols = Median:Lower, names_to = "Stat",values_to = "val")

Затем, не сильно меняя часть прорисовки, вы можете сделать:

ggplot(mydata, aes(x = NewDate))+
  geom_ribbon(aes(ymin = Lower, ymax = Upper), alpha =0.5)+
  geom_line(aes(y = Median), color = "darkblue")+
  geom_line(aes(y = Maximum), color = "red", linetype = "dashed", size = 1.5)+
  geom_line(aes(y = Minimum), color ="red", linetype = "dashed", size = 1.5)+
  facet_wrap(~variable, scales = "free")+
  scale_x_date(date_labels = "%b", date_breaks = "month", name = "Month", limits = c(min(mydata$NewDate),max(mydata$NewDate)+25))+
  ylab("Daily Cumulative Precipitation (mm)")+
  geom_text(data = mydata_label, 
            aes(x = NewDate+5, y = val, label = Stat, color = Stat), size = 2, hjust = 0, show.legend = FALSE)+
  scale_color_manual(values = c("Median" = "darkblue","Maximum" = "red","Minimum" = "red","Upper" = "black", "Lower" = "black"))

enter image description here

Я специально уменьшил размер текстовой надписи из-за недостатка места, чтобы вы могли увидеть их все. Но исходя из рисунка, который вы прикрепили к своему вопросу, у вас должно быть достаточно места для его работы.

...