将时间序列转换为R中的数据帧
我有一个月列的时间序列和30行的年值,我试图转换成一个数据框架。问题是,当执行此操作时,代码会反转列和行的值,我不知道如何阻止这种情况发生。我使用的代码如下:将时间序列转换为R中的数据帧,r,dataframe,type-conversion,time-series,R,Dataframe,Type Conversion,Time Series,我有一个月列的时间序列和30行的年值,我试图转换成一个数据框架。问题是,当执行此操作时,代码会反转列和行的值,我不知道如何阻止这种情况发生。我使用的代码如下: data.frame(matrix(data = spi_ts_12,nrow = 30, ncol = 12)) 原始时间序列的一部分如下所示: spi_ts_12 Jan Feb Mar Apr May Jun
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
根据数据在后续步骤中的分析方式,可能适合将其转换为窄格式整洁的数据框,其中每一行是
年
和月
的唯一组合
通过添加year
列并使用tidyr::pivot\u 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)
textData%
枢轴长度(-year,name_to=“month”,values_to=“value”)
头部(潮间带,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
>头部(潮汐数据,10)
#一个tibble:10x3
年月价值
2001年1月1日
2001年2月2日
2001年3月3日
2001年4月4日
2001年5月5日
2001年6月2日
2001年7月7日
2002年1月8日-0.0727
2002年2月9日340
2002年3月10日0.536
此时,每行每月包含一个值。您的解决方案可能是
byrow=TRUE
比较两个数据集,似乎数据集1中的第一行现在位于数据集2的第一列<代码>矩阵正在以列方式读取spi\u ts\u 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
m你说的是xts
时间序列吗?其他答案把这一点想得太多了,却忽略了真正的问题-数据。frame
不是一个转换函数
您希望as.data.frame()
-xts
将定义为.data.frame.xts
S3方法。你确定你的数据有12列是在矩阵调用中指定的吗?请按照标记页顶部的指示,使用dput
显示你的输入,以便我们准确地知道你有什么。是的,我意识到我没有使用转换功能。谢谢你的提示!