Программирование R и GGPLOT2 - как суммировать данные для создания линейного графика

Я очень плохо знаком с R и хочу создать линейный график, используя GGPLOT2 для набора данных, которые у меня есть. Данные состоят из Dates,Comments,Qtys - существует несколько комбинаций date/comment/qtys, но мне нужно сделать так, чтобы данные были в месте, где каждая комбинация date и comment имеет ОДНО значение для qty - по существу, чтобы СУММАТЬ их. Я знаю, как это сделать в SQL, и я использую пакет sqldf, чтобы попытаться добиться того же, но вместо этого мне возвращается одна строка.

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

Date     Comments         BuysToForecast
   <fct>    <fct>                     <int>
 1 4/6/2018 Approved                    573
 2 4/6/2018 ""                          363
 3 4/6/2018 ""                          503
 4 4/6/2018 ""                          324
 5 4/6/2018 Cancelled                  1844
 6 4/6/2018 Consumed By SO's            422
 7 4/6/2018 Consumed By SO's            790
 8 4/6/2018 Reduced                     515
 9 4/6/2018 Reduced                     790
10 4/6/2018 Approved                   1378

то, что мне нужно, например, = будет только одно 4/5/2018/ потребляемое значением SO /Qty, которое будет иметь все qtys. Когда я использую приведенный ниже SQL в sqldf, мне говорят, что результаты показаны:

SQLDF:

dp1 <- sqldf("select Date, 
                     Comments,
                     SUM(BuysToForecast) AS 'SUM' from dp")

head(dp1)(example data): 

       Date Comments     SUM
1 5/30/2018 Approved 2062046

заранее извиняюсь за любые проблемы с форматированием - очень новый для R

2 ответа

Вот пример с поддельными данными, которые, я надеюсь, похожи на ваши данные.

library(tidyverse)
library(lubridate)

# Create fake data
set.seed(2)
n=1e3
dat = data_frame(date = sample(seq(ymd("2015-01-01"), ymd("2015-02-28"), length=60), n, replace=TRUE),
                 comment=sample(LETTERS[1:5], n, replace=TRUE),
                 value=sample(1:100, n, replace=TRUE))

# Convert date to factor to match your data
dat$date = format(dat$date, "%m/%d/%Y")
dat$date = factor(dat$date)

Хорошо, теперь мы готовы начать. Сначала мы конвертируем ваши значения "date" в класс Date класса R. Прямо сейчас ваши даты закодированы как фактор-класс, что означает, что R рассматривает его как категориальную переменную. Преобразование его в класс Date приведет к тому, что ggplot будет рассматривать их как даты, а не категории. Мы будем использовать lubridate mdy функция (сокращение от месяца-дня-года, которое является порядком значений в столбце даты).

# Convert date to Date class
dat$date = mdy(dat$date)

Теперь есть два варианта. Предварительно суммируйте данные и передайте обобщенные данные в ggplot:

dat %>% 
  group_by(date, comment) %>% 
  summarise(value=sum(value)) %>% 
  ungroup %>% 
ggplot(aes(date, value, colour=comment)) +
  geom_line() +
  geom_point()

Или пусть ggplot позаботится о сводке для вас:

ggplot(dat, aes(date, value, colour=comment)) +
  stat_summary(fun.y=sum, geom="line") +
  stat_summary(fun.y=sum, geom="point")

В любом случае, сюжет выглядит так:

С ggplot сделать сводку здесь было проще, но иногда вам потребуется дополнительная гибкость обработки данных вне ggplot.

Вам нужно использовать group by иметь сумму для каждой группы. Оператор SQL, показанный в вопросе, запрашивает только общую сумму. Предполагая данные в примечании в конце (взято из вопроса).

library(ggplot2)
library(sqldf)

dp <- dp0
dp$Date <- as.Date(dp$Date, "%m/%d/%Y")

dp1 <- sqldf("select Date, Comments, SUM(BuysToForecast) AS 'SUM' 
              from dp 
              group by Date, Comments")

ggplot(dp1, aes(Date, SUM, color = Comments)) + 
  geom_point() +
  geom_line()

Заметка

Lines <- "Date     Comments         BuysToForecast
 1 4/6/2018 Approved                    573
 2 4/6/2018 \"\"                          363
 3 4/6/2018 \"\"                          503
 4 4/6/2018 \"\"                          324
 5 4/6/2018 \"Cancelled\"                  1844
 6 4/6/2018 \"Consumed By SO's\"            422
 7 4/6/2018 \"Consumed By SO's\"            790
 8 4/6/2018 Reduced                     515
 9 4/6/2018 Reduced                     790
10 4/6/2018 Approved                   1378"

dp0 <- read.table(text = Lines)
Другие вопросы по тегам