如何将2个时间序列数据(宽表)合并为1个数据帧(宽表)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将2个时间序列数据(宽表)合并为1个数据帧(宽表)?相关的知识,希望对你有一定的参考价值。

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

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),以便表格清楚地了解其内容。

答案

通过使用,t(transpose),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
另一答案

希望这可以帮助!

#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

以上是关于如何将2个时间序列数据(宽表)合并为1个数据帧(宽表)?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧

将 1300 个数据帧合并为一个帧变得非常慢

如何将 3 个 Pandas 数据帧合并到第 4 个数据帧以匹配列值名称?

如何基于多个条件更快地合并 2 个 pandas 数据帧

如何将宽数据帧转换为长数据帧

Python pandas:合并两个没有键的表(将 2 个数据帧与广播所有元素相乘;NxN 数据帧)