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

Я очень плохо знаком с 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 ]

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

Вам нужно использовать 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)
0 голосов
/ 31 мая 2018

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

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")

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

enter image description here

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

...