我有一个问题可能很简单,但一直很难找到解决方案。 我有不同公司和不同年份的数据,如下所示:
我想在一张图中为所有公司绘制一种时间序列图。关键是我不希望0为相应间隔的缺失值。我期望的结果是将日期作为X轴,将值作为Y轴。因此,例如,CompanyA的行的结果将是一条水平线,从2001-02开始,到2001-06的高度1000结束(作为Y值)。我想想象一下不同公司的间隔时间。 我试图在R中使用ggplot2来绘制它但不是很成功。有人可以帮我在R画这个吗?我有超过500行和超过180列。
答案 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")
数据强>
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)
```