2017-03-27 71 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