【问题标题】:Converting time series to data frame in R [closed]在R中将时间序列转换为数据框[关闭]
【发布时间】:2020-09-20 11:12:19
【问题描述】:

我有一个包含月度列和 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

【问题讨论】:

  • 您确定您的数据有 matrixcall 中指定的 12 列吗?
  • 请按照r 标签页顶部的说明使用dput 显示您的输入,以便我们准确了解您的内容。

标签: r dataframe type-conversion time-series


【解决方案1】:

您是在谈论xts 时间序列吗?其他答案在忽略真正问题的同时过度思考这个问题 - data.frame 不是转换函数。

你想要as.data.frame()-xts 定义一个as.data.frame.xts S3 方法。

【讨论】:

  • 是的,我意识到我没有使用转换功能。感谢您的提示!
【解决方案2】:

根据后续步骤中将如何分析数据,将其转换为窄格式整齐数据框可能是合适的,其中每一行是yearmonth 的唯一组合。

可以通过添加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 

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

【讨论】:

    【解决方案3】:

    您的解决方案可能是byrow = TRUE

    比较您的两个数据集,似乎数据集 1 中的第一行现在位于数据集 2 的第一列中。matrix 正在按列读取 spi_ts_12 中的值,如果您希望它们按行读取,则需要设置byrow = TRUE

    这是一个例子:

    m <- 1:10
    
    # That's what your code does
    data.frame(matrix(m, ncol = 2, nrow = 5))
    X1 X2
    1  1  6
    2  2  7
    3  3  8
    4  4  9
    5  5 10
    
    # That's what it should do
    data.frame(matrix(m, ncol = 2, nrow = 5, byrow = TRUE))
    X1 X2
    1  1  2
    2  3  4
    3  5  6
    4  7  8
    5  9 10
    
    

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 2017-12-13
      • 2022-11-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多