2017-03-27 97 views
1

對不起,這可能有一個明顯的答案,但我有點不確定該怎麼做。繪製R中稍雜亂的時間序列數據

例如說我有一個數據集,我有名字的人列表,銷售他們製作的數量,他們讓這些銷售的日期,所有的格式如下:

Name | Date |  Sales 
------------------------------------ 
AAA  | 01/01/2001 |  50 
AAA  | 01/02/2001 |  62 
AAA  | 01/03/2001 |  73 
...  | ...  |  ... 
AAA  | 05/15/2001 |  20 
BBB  | 02/06/2001 |  51 
BBB  | 02/09/2001 |  45 
...  | ...  |  ... 
BBB  | 04/13/2001 |  3 
CCC  | 01/22/2001 |  78 
...  | ...  |  ... 
...  | ...  |  ... 

基本上,我的數據看起來有點像上面這樣 - 有多個不同的名稱,並且每個名稱的日期也沒有適當對齊(例如,與另一個人相比,一個人可能比一年前更早地開始工作,因此銷售數據更早在一年)。除此之外,日期可能會跳過一點,我們可能會有一個日期4/3/2001,然後它可能會在下一個單元格中前進到4/25/2001。

我現在想要做的是繪製全年的數據,以便我擁有所有不同的人(即AAA,BBB,CCC,...)以及他們與他們一起製作的所有銷售使這些銷售都在一個大的陰謀。

現在,我可以想辦法做到這一點 - 首先使用subset()函數並按名稱對數據集進行子集化,然後我可以用這種方式繪製數據。問題在於我覺得這樣做效率不高,而且我也確信,即使數據有點奇怪,R必須有更好的方法繪製時間序列數據。如果任何人有一些建議或可以提供一些幫助,那麼我會很感激,在此先感謝。

+0

在未來,請您提供一個可重複的例子http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example? – aelwan

+0

非常抱歉,您的評論正是我正在尋找的,但我想在接受它之前正確回覆它:) – ThePlowKing

+0

無後顧之憂。如果我的回答不是你想要的,我只是想幫忙。 – aelwan

回答

3

你在找這樣的嗎?

library(dplyr) 
library(tidyr) 
library(ggplot2) 
#Create data.frame 
Date <- as.Date(c(seq(as.Date("2001-01-03"), as.Date("2001-10-17"), by = 1), 
        seq(as.Date("2001-05-10"), as.Date("2001-12-17"), by = 1), 
        seq(as.Date("2001-04-12"), as.Date("2001-11-17"), by = 1))) 
Name <- c(rep("AAA", 288), rep("BBB", 222), rep("CCC", 220)) 
Sales <- c(sample(10:20, 288, replace = T), sample(50:60, 222, replace = T), sample(80:90, 220, replace = T)) 
df <- data.frame(Name, Date, Sales) 

#select specific rows(dates) to create irregular time series (missing dates) 
df1 <- df[c(1:50, 100:150, 190:288, 289:370, 400:450, 480:510, 511:640, 670:730),] %>% 
    tidyr::spread(Name, Sales) 

#create a data.frame (df_whole_yr) that have continuous dates for whole 2001 
df_whole_yr <- data.frame(Date = seq(as.Date("2001-01-01"), as.Date("2001-12-31"), by = 1)) %>% 
    dplyr::left_join(., df1, by ="Date") %>% #join irregular timeseries df1 with the continuous timeseries df_whole_yr 
    tidyr::gather("Name", "Sales", 2:4) %>% #convert it to long format 
    ggplot(., aes(x =Date, y = Sales, color = Name))+ ##plot 
    geom_line(size = 0.2) 

enter image description here

+1

這是假定三個時間序列是固定的...雖然要考慮到OP系列的不規範性嗎? – useR

+2

@useR 謝謝。我已經更新了答案。請讓我知道,如果你認爲它還沒有考慮到OP系列的違規行爲。 如果OP提供了一個data.frame,會更容易。 – aelwan

+1

謝謝,這種方法正是我所尋找的,也感謝您對每一行的評論,這很有幫助,因爲我以前從未使用過這些軟件包,而且我也不知道每一行的含義。 – ThePlowKing