2017-07-26 74 views
-2

我有一個問題可能很簡單,但一直在困難的時候找到解決方案。 我有不同的公司和不同年份,看起來像這樣的數據:不考慮空字段的多個時間序列圖形

enter image description here

我想提請一種時間序列圖的所有公司在一個單一的圖形。重點是我不希望在相應的時間間隔內缺少值0。我期望的結果將日期作爲X軸,值作爲Y軸。因此,例如,對於公司A的線的結果將是從2001-02開始並在2001-06結束於1000的高度(作爲Y值)的水平線。我想要將不同公司的間隔可視化。 我試圖在R中使用ggplot2來繪製它,但並不真正成功。有人能幫我在R中畫出這個嗎?我有超過500行和超過180列。

+1

米娜嗨,你能不能請張貼代碼剪斷,它讓我們看到你的工作是什麼?謝謝 – Justin

+0

今後,我建議您發佈您的數據(如我的答案),而不是打印屏幕,以方便其他人爲您提供幫助。另外,@Justin指出你應該展示你所做的努力(你試過的代碼,但不像你在你的問題中提到的那樣)。 – aelwan

+0

@Mina 在你的問題中,你提到你有不同的年份,但對我來說,這是同一年,只是不同的日子或月份。你能否澄清這一點? – aelwan

回答

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

DATA

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") 
+0

謝謝@aelwan,但這裏是問題:我的數據不是YMD格式...它是在YM格式.. 。 – Mina

+0

@Mina 請檢查我的更新答案。 – aelwan

0

你這裏有多個問題是正視在 「數據扯皮」 的區域。最大的問題是將實際值計入您的缺失值字段。 幸運的是,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.locfxts包填寫日期。

```{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 

當調用上xts類的對象的plot功能,多元時間序列曲線被容易地製造。

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

xts plot of na.locf filled series

+1

感謝您的回答。我在編寫數據時犯了一個錯誤。 companyC在四月份的價值應該是5000而不是500.你能否相應地更新你的答案。 – aelwan

+1

完成。謝謝 – Justin

+0

@Justin非常感謝你的詳細解釋。這個解決方案正是我需要的。我嘗試將你的過程應用於我的數據,但是在執行rownames(df_long)的步驟中,它顯示不允許重複'row.names'的錯誤...我檢查過並且數據中沒有這種重複...可以嗎請幫我擺脫這種情況?我將數據集添加到我的問題,如果它有幫助... – Mina

相關問題