在 R 中绘制稍微杂乱无章的时间序列数据

Plotting slightly disorganised Time Series Data in 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 必须有更好的方法来绘制时间序列数据,即使数据有点奇怪。如果有人有一些建议或可以提供一些帮助,那么我将不胜感激,在此先感谢。

您在找这样的东西吗?

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)