忽略空字段的一个图中的多个时间序列图

时间:2017-07-26 20:20:54

标签: r ggplot2 timeserieschart

我有一个问题可能很简单,但一直很难找到解决方案。 我有不同公司和不同年份的数据,如下所示:

enter image description here

我想在一张图中为所有公司绘制一种时间序列图。关键是我不希望0为相应间隔的缺失值。我期望的结果是将日期作为X轴,将值作为Y轴。因此,例如,CompanyA的行的结果将是一条水平线,从2001-02开始,到2001-06的高度1000结束(作为Y值)。我想想象一下不同公司的间隔时间。 我试图在R中使用ggplot2来绘制它但不是很成功。有人可以帮我在R画这个吗?我有超过500行和超过180列。

2 个答案:

答案 0 :(得分:1)

你正在寻找这样的东西吗?

library(tidyverse)
library(zoo)
df %>% 
  tidyr::gather("date", "value", 2:7) %>% 
  dplyr::filter(!is.na(value)) %>% 
  ggplot(., aes(x = as.factor(as.yearmon(date)), y = value, group = CompanyName, colour = CompanyName))+
    geom_line() +labs(x = "Date")

enter image description here

数据

df <-  read.table(text =c("
CompanyA    NA  1000    NA  NA  NA  1000
CompanyB    600 NA  NA  NA  600 NA
CompanyC    NA  5000    NA  5000    NA  NA"), header = F) 

colnames(df) <-  c("CompanyName",   "2001-01",  "2001-02"   ,"2001-03", "2001-04",  "2001-05",  "2001-06")

答案 1 :(得分:1)

这里有多个问题,正好在“数据争论”领域。最大的问题是将实际值归入缺失值字段。 幸运的是,xts时间序列库包含执行此操作的功能,以及绘制多个时间序列的功能,这是您的最终目标。

但是,在我们使用这些精彩功能之前,您必须做一些工作,将您的数据转换为xts对象。

首先使用@aelwan的方法重新创建上面的数据。

    ```{r, tidy=TRUE}

    df <-  read.table(text = c(" 
    CompanyA    NA  1000    NA  NA  NA  1000
    CompanyB    600 NA  NA  NA  600 NA
    CompanyC    NA  5000    NA  5000 NA  NA"), 
                      header = F)   
    colnames(df) <-  c("CompanyName", "2001-01", "2001-02" ,"2001-03", "2001-04",  "2001-05", "2001-06")

    df

              CompanyName 2001-01 2001-02 2001-03 2001-04 2001-05 2001-06
            1    CompanyA      NA    1000      NA      NA      NA    1000
            2    CompanyB     600      NA      NA      NA     600      NA
            3    CompanyC      NA    5000      NA     500      NA      NA

您的数据似乎是宽格式的,因此我建议将其转换为长格式。这将需要几个步骤来保留重要信息,例如列名和行名,以及数据类(数字)。

首先,转置数据框

df_t <- t(df)

现在,保存第一行,该行现在包含公司名称。

 company_names <- df_t[1,]

转置过程会产生“矩阵”类的对象。删除第一行并生成df_t对象类data.frame。

  df_t <- data.frame(df_t[-1, ], stringsAsFactors = FALSE)

将存储在“company_names”中的公司名称添加回列名称

colnames(df_t) <- company_names

您的列数据类也可能在转置期间丢失,因此请使用sapply函数将所有列转换为数字类。

   df_long <- data.frame(sapply(df_t, FUN=as.numeric), row.names = rownames(df_t))

    # print the long form results
    df_long
```
        CompanyA CompanyB CompanyC
Jan 2001       NA      600       NA
Feb 2001     1000       NA     5000
Mar 2001       NA       NA       NA
Apr 2001       NA       NA     5000
May 2001       NA      600       NA
Jun 2001     1000       NA       NA

现在,将新的df_long data.frame转换为基于xts对象的时间序列索引,以访问所需的时间序列函数。

```{r}
library(xts)

# convert rownames "2001-01, 2001-02, ..." to yearmon format
rownames(df_long) <- as.yearmon(rownames(df_long), "%Y-%m")

# pass the dates as an index to the xts via the `order.by` arguement.
df_xts <- xts(df_long , order.by = as.yearmon(rownames(df_long)))
```

最后,我们可以使用na.locf包中的“最后一次观察结果”功能xts来填写日期。

```{r}
df_locf <- na.locf(df_xts)

df_locf
```
         CompanyA CompanyB CompanyC
Jan 2001       NA      600       NA
Feb 2001     1000      600     5000
Mar 2001     1000      600     5000
Apr 2001     1000      600     5000
May 2001     1000      600     5000
Jun 2001     1000      600     5000

在类plot的对象上调用xts函数时,可以轻松生成多变量时间序列图。

```{r}
# The plot function works.
plot(df_locf)
```

xts plot of na.locf filled series