Программирование 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)