Лучший способ построить по часам день за месяцем в г - PullRequest
0 голосов
/ 26 июня 2018

В настоящее время я создал следующий фрейм данных в R, но у меня проблемы с визуализацией.

Датафрейм выглядит следующим образом:

date   weekday   dayhour    amount
2017-06    0         1         100
2017-06    0         2         200
2017-06    0         3         150
2017-06    0         4         600
2017-06    0         5         75
....
2018-06    6         21        60
2018-06    6         22        90
2018-06    6         23        150
2018-06    6         24        110

Сумма - это среднее значение этого дня по часам за этот месяц. Так, например, месяц июнь 2017 года в первый час каждого понедельника июня имеет в среднем 100.

Теперь идея состоит в том, чтобы отобразить мои данные в R на нескольких графиках, которые будут показывать мне данные по часам по дням недели для данного месяца. Таким образом, 12 графиков с каждым количеством на оси у и час + день недели на оси х.

Я пробовал несколько подходов, таких как циклическое прохождение месяцев и построение их с помощью par (mfrow = c (2,6)). Также я попытался построить их один за другим. Однако я все еще новичок в R, и я не могу найти хорошую документацию или учебное пособие о том, как это сделать. На данный момент мне удалось только собрать точки данных в один цикл по дням недели, а не по часам, выполнив следующие действия с набором данных без часов:

increase = 7
for (i in (length(occupancy_by_day)/7)) {
  data = head(occupancy_by_day,increase:increase+increase)
  plot(average_occupancy ~ Weekday, data=data)
  increase = increase + 7
}

Мое ближайшее предположение к правильному ответу в данный момент примерно такое:

par(mfrow = c(2,6))

increase = 06
for (i in (length(occupancy_by_day)/30,5)) {
  data = occupancy_by_day[occupancy_by_day$date == paste(c('2017-',increase)), ]
  plot(amount ~ weekday, data=data)
  increase = increase + 1
}

Это дает мне ошибку:

Error in plot.window(...) : need finite 'xlim' values

Кто-нибудь знает хорошее решение для построения данных в R?

Заранее спасибо за любую помощь / комментарии!

EDIT: Приоритетом в этом посте будет то, как вывести данные по часам за днем ​​недели Я мог бы повторять месяцы вручную, однако мне все равно нужно было бы их построить. Цикл за каждый месяц будет добавлен бонус. Прямо сейчас у меня есть следующее:

data =occupancy_by_day[occupancy_by_day$date == '2017-06', ]
plot(Amount ~ weekday+dayhour, data=data)

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

ДОБАВЛЕНА ЧЕРТЕЖ КОНЦЕПЦИИ: https://imgur.com/qKFbbmJ

ОТВЕТ:

В конце концов я сделал небольшой обходной путь, чтобы построить их с помощью:

ggplot(data = data[data$date == '2017-12', ], aes(plotstamp, Amount, group=Weekday, col=Weekday)) + 
   geom_line() +
   geom_point() + 
   ggtitle("December 2017")

plotstamp - это дополнительный столбец / индекс, который я добавил к своему DF, что позволило мне непрерывно отображать значения. Тогда я просто строил их отдельно в месяц.

1 Ответ

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

Сделать аналогичные данные

Я думаю, что это частичное решение, которое вы запрашиваете при редактировании (если я правильно понимаю вашу задачу), но я считаю, что вы можете циклически проходить месяцы таким же образом. Единственный способ, которым я мог придумать, это преобразовать даты, которые у вас есть, в класс. Я использовал некоторые подготовленные данные о дате, но вы можете исправить ваши, используя команды strptime() и paste(), чтобы соответствовать моим. Кроме того, данные, которые я сделал, только за два дня.

date1 <- c(rep("2017-06-1",24),rep("2017-06-2",24))
weekday <- c(rep(0,24),rep(1,24))
dayhour <- c(1:24,1:24)
# Add dayhour to date
date <- paste(date1, dayhour, sep = " ")
date <- strptime(date, "%Y-%m-%d %H")
amount <- c(1:24,(48:25)*2)

dat <- data.frame(date,weekday,dayhour,amount)
View(dat)

plot(x=dat$date, y=dat$amount)

Вот так выглядят мои созданные данные.

                 date weekday dayhour amount
1 2017-06-01 01:00:00       0       1      1
2 2017-06-01 02:00:00       0       2      2
3 2017-06-01 03:00:00       0       3      3
4 2017-06-01 04:00:00       0       4      4
....
46 2017-06-02 22:00:00       1      22     54
47 2017-06-02 23:00:00       1      23     52
48 2017-06-03 00:00:00       1      24     50

Петля для сюжета.

Если вы напишите это в документе с разметкой R, вы получите хорошие страницы для каждого графика, поэтому вам не придется использовать par(mfrow = c(1,2)). Вам, вероятно, также необходимо исправить аргументы цикла, чтобы они соответствовали вашим данным.

par(mfrow = c(1,2))
start <- 0
end <- 23
step = 1
for (i in 1:(length(dat$date)/24)) {
  data <- dat[(start+step) : (end+step), ]  # The parenteses at (start+step) and (end+step) are important!
  plot(x = data$date, y = data$amount)
  step = step + 23
}

Надеюсь, это поможет вам.

P.S. Это первый ответ, который я пишу, поэтому не стесняйтесь редактировать или улучшать мой ответ.

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