【问题标题】:How to merge 2 time series data (wide table) into 1 data frame (wide table)?如何将 2 个时间序列数据(宽表)合并为 1 个数据框(宽表)?
【发布时间】:2018-05-31 11:46:06
【问题描述】:

我正在使用RStudio,我的R 代码有以下两个输出:

actual_2017 <- tail(mydata,12)
> actual_2017
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2017 5980 5341 5890 5596 5753 5470 5589 5545 5749 5938 5844 5356

> predicted_2017 <- head(pred1,12)
> predicted_2017
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
 2017 5762 5275 5733 5411 5406 4954 5464 5536 5805 5819 5903 5630

> str(actual_2017)
 Time-Series [1:12] from 2017 to 2018: 5980 5341 5890 5596 5753 5470 5589 5545 5749 5938 ...

 > str(predicted_2017)
   Time-Series [1:12] from 2017 to 2018: 5763 5275 5734 5412 5407 ...

我想将actual_2017predicted_2017 合并到一个数据框中,但要保持宽表格式。

假设这是我所追求的数据框:

         Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2017(A) 5980 5341 5890 5596 5753 5470 5589 5545 5749 5938 5844 5356
2017(P) 5762 5275 5733 5411 5406 4954 5464 5536 5805 5819 5903 5630  

我怎样才能做到这一点?另外,我将需要 2017 旁边的 (A) 和 (P),以便表格清楚地显示其内容。

【问题讨论】:

    标签: r dataframe time-series


    【解决方案1】:

    通过使用t(转置)、rbindnamesrownames等,你可以达到你想要的效果:

    actual_2017 <- data.frame(t(c(5980, 5341, 5890, 5596, 5753, 5470, 5589, 5545, 5749, 5938, 5844, 5356)))
    names(actual_2017 ) <- c("Jan", "Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
    rownames(actual_2017) <- "2017"
    actual_2017
          Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
    2017 5980 5341 5890 5596 5753 5470 5589 5545 5749 5938 5844 5356
    
    predicted_2017 <- data.frame(t(c(5762, 5275, 5733, 5411, 5406, 4954, 5464, 5536, 5805, 5819, 5903, 5630)))
    names(predicted_2017 ) <- c("Jan", "Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
    rownames(predicted_2017) <- "2017"
    predicted_2017
          Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
    2017 5762 5275 5733 5411 5406 4954 5464 5536 5805 5819 5903 5630
    
    merged <- rbind(actual_2017, predicted_2017)
    rownames(merged) <- c("2017 (A)", "2017 (P)")
    merged
              Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
    2017 (A) 5980 5341 5890 5596 5753 5470 5589 5545 5749 5938 5844 5356
    2017 (P) 5762 5275 5733 5411 5406 4954 5464 5536 5805 5819 5903 5630
    

    【讨论】:

    • 我在运行您的代码时得到以下输出:[,1] [,2] [,3] ... 2017 (A) 5980 5341 5890 ... 2017 (P) 5762 5275 5733 ...我想那是因为我正在合并 2 个 ts 文件。您给出的示例是合并 2 个数据框。
    • 您也可以使用数据框处理时间序列数据。上面的代码在代码下面给出了完全相同的输出。我正在使用 RevoREnterprise 7.3.0。所以,你应该得到与我使用的数据框方式完全相同的输出。我将答案转换为“可以复制粘贴”类型。所以,上面的代码解决了这个问题。
    【解决方案2】:
    #sample data (I cooked my own sample data, hope you don't mind it!)
    actual_2017 <- ts(tail(AirPassengers,12), start = 2017, frequency = 12) 
    predicted_2017 <- ts(head(AirPassengers, 12), start = 2017, frequency = 12) 
    
    #merge both timeseries data
    df <- rbind(actual_2017, predicted_2017)
    colnames(df) <- month.abb
    rownames(df) <- gsub("(^\\w).*(\\d{4}$)","\\2 (\\1)",rownames(df))
    df
    

    输出是:

             Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    2017 (a) 417 391 419 461 472 535 622 606 508 461 390 432
    2017 (p) 112 118 132 129 121 135 148 148 136 119 104 118
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2023-02-18
      • 1970-01-01
      • 2016-03-13
      • 2021-07-03
      • 1970-01-01
      相关资源
      最近更新 更多