#r #plot #time-series #data-visualization #aggregate-functions
#r #график #временные ряды #визуализация данных #агрегатные функции
Вопрос:
Я пытаюсь научиться работать с данными временных рядов. Я создал несколько поддельных ежедневных данных, попытался объединить их по неделям, а затем построить график:
set.seed(123)
library(xts)
library(ggplot2)
date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")
property_damages_in_dollars <- rnorm(731,100,10)
final_data <- data.frame(date_decision_made, property_damages_in_dollars)
y.mon<-aggregate(property_damages_in_dollars~format(as.Date(date_decision_made),
format="%W"),data=final_data, FUN=sum)
y.mon$week = y.mon$`format(as.Date(date_decision_made), format = "%W")`
g = ggplot(y.mon, aes(x = week, y=property_damages_in_dollars) geom_line(aes(group=1))
График, похоже, работает, но на оси всего 52 «галочки», когда их должно быть в два раза больше (данные за 2 года). Я думаю, что при преобразовании данных из ежедневных в еженедельные возникает проблема — не мог бы кто-нибудь показать мне, как это исправить?
В моих фактических данных у меня есть данные за 30 лет. Даты кажутся довольно многолюдными. Я попытался «разогнать» даты:
library(scales)
g scale_x_date(date_breaks = "1 week", expand = c(0,0))
theme(axis.text.x = element_text(angle=90, vjust=.5))
Но это тоже не работает. Не мог бы кто-нибудь, пожалуйста, показать мне, что я делаю не так?
Спасибо
Примечание: если есть два столбца, можно ли по-прежнему использовать агрегатную функцию?
date_decision_made = seq(as.Date("2014/1/1"), as.Date("2016/1/1"),by="day")
date_decision_made <- format(as.Date(date_decision_made), "%Y/%m/%d")
property_damages_in_dollars <- rnorm(731,100,10)
other_damages_in_dollars <- rnorm(731,10,10)
final_data <- data.frame(date_decision_made, other_damages_in_dollars, property_damages_in_dollars)
y.mon<-aggregate(property_damages_in_dollars, other_damages_in_dollars ~format(as.Date(date_decision_made),
format="%Y/%m"),data=final_data, FUN=sum)
Комментарии:
1. если есть два столбца, можно ли по-прежнему использовать агрегатную функцию? date_decision_made = seq(как.Date(«2014/1/1»), как.Date(«2016/1/1″),по=»день») date_decision_made <- формат(как.Date(date_decision_made), «%Y/%m/%d») свойство_damages_in_dollars <- норма (731,100,10) other_damages_in_dollars <- rnorm(731,10,10) final_data <- data.frame(date_decision_made, other_decision_made, other_decision_made, property_decamages_in_dollars) y.mon<-aggregate(property_decision_in_dollars, other_decamages_in_dollars ~формат(как.Date(date_decision_made), формат=»%Y /%m»),данные=final_data, FUN=сумма)
Ответ №1:
Одним из способов может быть добавление года к неделе следующим образом:
library(ggplot2)
#Code 1
#Data
y.mon<-aggregate(property_damages_in_dollars~format(as.Date(date_decision_made),
format="%W-%y"),data=final_data, FUN=sum)
y.mon$week = y.mon$`format(as.Date(date_decision_made), format = "%W-%y")`
#Plot
ggplot(y.mon, aes(x = week, y=property_damages_in_dollars))
geom_line(aes(group=1))
scale_x_discrete(guide = guide_axis(n.dodge=2))
theme(axis.text.x = element_text(angle = 45))
Вывод:
Просто, если вам интересно, я оставлю это здесь, используя scale_x_date()
и агрегируя непосредственно по дате:
#Code 2
y.mon<-aggregate(property_damages_in_dollars~as.Date(date_decision_made),data=final_data, FUN=sum)
y.mon$week = y.mon$`as.Date(date_decision_made)`
#Plot
ggplot(y.mon, aes(x = week, y=property_damages_in_dollars))
geom_line(aes(group=1))
scale_x_date(date_labels = '%Y-%W',breaks = '8 weeks')
Вывод:
Комментарии:
1. спасибо за ваш ответ! Просто вопрос: я смоделировал даты с января-01-2014 по январь-01-2016. Это 2 года. разве за это время не должно быть 104 недель?
2. если бы вместо 1 было две переменные, мог бы следующий код все еще выполняться? y.mon<-агрегат (property_damages_in_dollars, other_damages_in_dollars ~формат (как.Date(date_decision_made), format=»%Y /%m»),data= final_data, FUN= сумма)
3. @stats555 Да, есть это число, но они отклонены по оси, чтобы избежать перекрытий!
4. Это сработало бы
y.mon<-aggregate(cbind(property_damages_in_dollars, other_damages_in_dollars) ~format(as.Date(date_decision_made), format="%Y/%m"), data=final_data, FUN=sum)
5. Я думаю, я понимаю: 01-14 — это «первая неделя» с 2014 года, а 01-15 — «первая неделя» с 2015 года?