首页 > 解决方案 > 在R中将时间序列转换为数据框

问题描述

我有一个包含每月列和 30 行的时间序列,其中包含我试图转换为数据框的值。问题是,当这样做时,代码会反转列和行的值,我不知道如何阻止这种情况发生。我正在使用的代码是这样的:

data.frame(matrix(data = spi_ts_12,nrow = 30, ncol = 12))

原始时间序列的一部分如下所示:

spi_ts_12
            Jan          Feb          Mar          Apr          May          Jun          Jul
1            NA           NA           NA           NA           NA           NA           NA
2  -0.072716360  0.339857586  0.536179857  1.224146721  1.066812903  0.903041290  1.495927052
3   1.874687022  1.842638334  1.822894060  1.289273431  0.931882600  1.046589831  0.459839100
4   0.924828112  1.130954986  1.156797627  1.417022228  1.888921382  1.528365517  1.260246481
5   0.072198409 -0.406376694 -0.510880719 -0.954572806 -1.606281038 -1.019738846 -1.041013230

但是像这样的东西我得到了代码

data.frame(matrix(data = spi_ts_12,nrow = 30, ncol = 12))
            X1          X2          X3          X4           X5           X6          X7
1           NA  0.45983910 -0.68314309 -0.71271456  0.573582434 -0.262227248  0.64884425
2           NA  0.14786275 -0.77433962 -0.22896126  0.532289278 -0.238559810  0.65724941
3           NA  0.20082562 -0.32444436 -0.57079826  0.642000515 -0.323273642  1.23843136
4           NA  0.13612275 -0.40369149 -0.34258291  1.159903215 -1.346109264  1.89273535

标签: rdataframetype-conversiontime-series

解决方案


根据后续步骤中数据的分析方式,将其转换为窄格式的整洁数据框可能是合适的,其中每一行都是year和的唯一组合month

可以通过添加一year列并使用tidyr::pivot_longer(). 我们从问题中提供的数据开始,如下所示。由于我们不知道起始年份,我们假设第一行是 2001 年。

textData <- "rowId            Jan          Feb          Mar          Apr          May          Jun          Jul
1            NA           NA           NA           NA           NA           NA           NA
2  -0.072716360  0.339857586  0.536179857  1.224146721  1.066812903  0.903041290  1.495927052
3   1.874687022  1.842638334  1.822894060  1.289273431  0.931882600  1.046589831  0.459839100
4   0.924828112  1.130954986  1.156797627  1.417022228  1.888921382  1.528365517  1.260246481
5   0.072198409 -0.406376694 -0.510880719 -0.954572806 -1.606281038 -1.019738846 -1.041013230"
df <- read.table(text = textData,header=TRUE)

library(tidyr)
library(dplyr)
tidyData <- df %>% mutate(year = 2000 + rowId) %>% 
     select(!contains("rowId")) %>% 
     pivot_longer(-year,names_to="month",values_to="value")
head(tidyData,10) 

...以及前几行输出:

> head(tidyData,10)
# A tibble: 10 x 3
    year month   value
   <dbl> <chr>   <dbl>
 1  2001 Jan   NA     
 2  2001 Feb   NA     
 3  2001 Mar   NA     
 4  2001 Apr   NA     
 5  2001 May   NA     
 6  2001 Jun   NA     
 7  2001 Jul   NA     
 8  2002 Jan   -0.0727
 9  2002 Feb    0.340 
10  2002 Mar    0.536 

此时,每一行每月包含一个值。


推荐阅读