gpt4 book ai didi

r - 如何按行在 data.table 中添加时间序列对象 (ts)?

转载 作者:行者123 更新时间:2023-12-04 17:46:01 29 4
gpt4 key购买 nike

我正在尝试按行存储 ts 对象。用于创建时间序列的月度数据(1980 年和 1981 年的 24 个月度值)在 DT 中按行顺序存储,所以我只想在 DT 中添加一列来存储每一行​​的“ts”对象() .这是一个可重复的示例,我尝试了三个不同的选项,但似乎没有一个像我预期的那样工作。

library(data.table)
DT <- data.table(ID=seq(1:10),
JAN_1980=rnorm(1:10),FEB_1980=rnorm(1:10),MAR_1980=rnorm(1:10),APR_1980=rnorm(1:10),MAY_1980=rnorm(1:10),JUN_1980=rnorm(1:10),JUL_1980=rnorm(1:10),AUG_1980=rnorm(1:10),SEP_1980=rnorm(1:10),OCT_1980=rnorm(1:10),NOV_1980=rnorm(1:10),DEC_1980=rnorm(1:10),JAN_1981=rnorm(1:10),FEB_1981=rnorm(1:10),MAR_1981=rnorm(1:10),APR_1981=rnorm(1:10),MAY_1981=rnorm(1:10),JUN_1981=rnorm(1:10),JUL_1981=rnorm(1:10),AUG_1981=rnorm(1:10),SEP_1981=rnorm(1:10),OCT_1981=rnorm(1:10),NOV_1981=rnorm(1:10),DEC_1981=rnorm(1:10))

# First attempt
DT[,TS_COL:=ts(.SD[,2:25,with=FALSE], start=c(1980,1), frequency=12)]

# Second
DT[,TS_COL:=ts(unlist(.SD[,2:25,with=FALSE]), start=c(1980,1), frequency=12)]

# Third
DT[,TS_COL:=list(list(list(ts(unlist(.SD[,2:25,with=FALSE]), start=c(1980,1), frequency=12))))]

我希望能够以这种方式访问​​特定行的 ts 对象(还没有运气):
DT[1,TS_COL]

...并获得类似(2 年的月度数据):
             Jan         Feb         Mar         Apr         May         Jun         Jul         Aug         Sep         Oct         Nov         Dec
1980 2.13303849 0.74954206 -0.45112504 2.13558888 1.11883498 -0.39074470 1.77374480 -0.19513901 0.49920019 -1.12875185 0.45598049 1.97730211
1981 0.62764761 -0.86330094 -0.51585664 0.59677770 -0.71073980 -0.26208961 -0.38833227 1.39841244 -1.50490225 -0.72018921 1.06684672 0.07126184

关于如何实现这一目标的任何提示?

最佳答案

我不记得曾经使用过 ts()我。我倾向于将不规则的时间序列存储为长格式。单个日期时间列,或单独的日期列和时间列(用于滚动到一天内的主要观察,而不是前一天)。然后我创建一个规则间隔的时间序列并将其加入数据,或者使用 which 找到窗口的开始和结束。和 roll并提取该窗口的子集。

也就是说,让我们尝试使用 ts() .

请在您的问题中包含错误或警告消息。请参阅 Support page 上的第 6 项和第 7 项.你的例子是不可复制的;即我收到以下警告,但您收到不同的警告是可行的(您没有包含它,所以没有什么可以尝试重现的)。示例也不是最小的,因为我们不需要 20 列环绕控制台输出。

DT[,TS_COL:=ts(.SD[,2:25,with=FALSE], start=c(1980,1), frequency=12)]
# Warning messages:
# 1: In `[.data.table`(DT, , `:=`(TS_COL, ts(.SD[, 2:25, with = FALSE], :
# 24 column matrix RHS of := will be treated as one vector
# 2: In `[.data.table`(DT, , `:=`(TS_COL, ts(.SD[, 2:25, with = FALSE], :
# Supplied 240 items to be assigned to 10 items of column 'TS_COL' (230 unused)

首先,让我们看一下手册。 ?ts包含以下签名:

ts(data = NA, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption("ts.eps"), class = , names = )



您正在使用第一个参数 data所以它说:

data: a vector or matrix of the observed time-series values. A data frame will be coerced to a numeric matrix via data.matrix. (See also ‘Details’.)



由于 data.table 继承自 data.frame,它也是一个 data.frame。因此 data.table 将被强制转换为矩阵。

再往下,我们看到了一些关于 matrix 的内容:

In the matrix case, each column of the matrix data is assumed to contain a single (univariate) time series.



现在让我们分解问题并检查它试图分配的 RHS。只需删除 TS_COL:=部分并再次运行它以返回 RHS,以便我们可以查看它。
RHS = DT[,ts(.SD[,2:25,with=FALSE], start=c(1980,1), frequency=12)]
class(RHS)
# [1] "mts" "ts" "matrix"
dim(RHS)
# [1] 10 24
dim(DT)
# [1] 10 26
length(RHS)
# [1] 240
storage.mode(RHS)
# [1] "double"

所以它是一个矩阵。更糟糕的是 double而不是 integer . (回想一下,我们不喜欢 Date 在 base 中用于 data.table ,因为奇怪的是, Datedouble 而不是 integer 。)

您不能将矩阵存储为 data.table 中的列。 data.table 将矩阵视为它在内部的向量,警告消息(如本答案中所示)所暗示的。以下是警告消息:
24 column matrix RHS of := will be treated as one vector
Supplied 240 items to be assigned to 10 items of column 'TS_COL' (230 unused)

这些警告是由 data.table 代码创建的,我认为非常好。

因此,如果您要继续使用 ts()类作为 data.table 的一列,那么您需要将矩阵强制为 24 列(24 个向量,所有 10 长)的列表,而不是 24 列的矩阵(内部一个向量 240 长)。

但在这一点上似乎是 ts() class 不是完成这项工作的正确工具。你真正需要做什么?最好备份并描述更大的图景。

关于r - 如何按行在 data.table 中添加时间序列对象 (ts)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664669/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com