Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何从a";ts";对象_R_Time Series - Fatal编程技术网

R 如何从a";ts";对象

R 如何从a";ts";对象,r,time-series,R,Time Series,我将使用AirPassenger数据集进行再现性: data(AirPassengers) class(AisPassengers) ## [1] "ts" AirPassengers ## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1949 112 118 132 129 121 135 148 148 136 119 104 118 1950 115 126 141 135 125 149 170 170 158 133 114 14

我将使用AirPassenger数据集进行再现性:

data(AirPassengers)
class(AisPassengers)
## [1] "ts"
AirPassengers
##   Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 112 118 132 129 121 135 148 148 136 119 104 118
1950 115 126 141 135 125 149 170 170 158 133 114 140
1951 145 150 178 163 172 178 199 199 184 162 146 166
1952 171 180 193 181 183 218 230 242 209 191 172 194
1953 196 196 236 235 229 243 264 272 237 211 180 201
1954 204 188 235 227 234 264 302 293 259 229 203 229
1955 242 233 267 269 270 315 364 347 312 274 237 278
1956 284 277 317 313 318 374 413 405 355 306 271 306
1957 315 301 356 348 355 422 465 467 404 347 305 336
1958 340 318 362 348 363 435 491 505 404 359 310 337
1959 360 342 406 396 420 472 548 559 463 407 362 405
1960 417 391 419 461 472 535 622 606 508 461 390 432
在不将“ts”对象转换为另一类的情况下,是否有办法获得年度季节平均值(见下表预期结果)

现在,我可以通过将“ts”对象转换为xts(包xts)或数据帧(然后将包seas与mkseas一起使用)来实现这一点

是否有任何“ts”方法可以使用,这样我就不必将“ts”对象转换成另一个类

预期结果,超出“ts”对象:

Year Average (Jun, Jul, Aug)
1949 143.667
1950 163.00
1951 192.00
...
...
1)尝试
aggregate.ts
。这将输入一个
“ts”
对象,并输出一个表示每年六月、七月和八月的平均值的对象。这假设完整的年份:

aggregate(AirPassengers, 1, function(x) mean(x[6:8]))
给予:

Time Series:
Start = 1949 
End = 1960 
Frequency = 1 
 [1] 143.6667 163.0000 192.0000 230.0000 259.6667 286.3333 342.0000 397.3333
 [9] 451.3333 477.0000 526.3333 587.6667
> zyr2
    1949     1950     1951     1952     1953     1954     1955     1956 
      NA 163.0000 192.0000 230.0000 259.6667 286.3333 342.0000 397.3333 
    1957     1958     1959     1960 
451.3333 477.0000 526.3333 587.6667 
> DFyr
   year      AP2
1  1949       NA
2  1950 163.0000
3  1951 192.0000
4  1952 230.0000
5  1953 259.6667
6  1954 286.3333
7  1955 342.0000
8  1956 397.3333
9  1957 451.3333
10 1958 477.0000
11 1959 526.3333
12 1960 587.6667
2)如果你想考虑不完整的第一年和/或最后几年,这会变得越来越尴尬,但这里有一个解决方案。这相当难看,因为
tapply
正在转换为矩阵,然后我们必须从中手动重建
“ts”
输出序列

AP2 <- window(AirPassengers, start = c(1949, 9))
unname(ts(tapply(AP2, list(floor(time(AP2)), cycle(AP2) %in% 6:8), mean)[, "TRUE"], 
   start = floor(time(AP2)[1])))

Time Series:
Start = 1949 
End = 1960 
Frequency = 1 
 [1]       NA 163.0000 192.0000 230.0000 259.6667 286.3333 342.0000 397.3333
 [9] 451.3333 477.0000 526.3333 587.6667
给予:

Time Series:
Start = 1949 
End = 1960 
Frequency = 1 
 [1] 143.6667 163.0000 192.0000 230.0000 259.6667 286.3333 342.0000 397.3333
 [9] 451.3333 477.0000 526.3333 587.6667
> zyr2
    1949     1950     1951     1952     1953     1954     1955     1956 
      NA 163.0000 192.0000 230.0000 259.6667 286.3333 342.0000 397.3333 
    1957     1958     1959     1960 
451.3333 477.0000 526.3333 587.6667 
> DFyr
   year      AP2
1  1949       NA
2  1950 163.0000
3  1951 192.0000
4  1952 230.0000
5  1953 259.6667
6  1954 286.3333
7  1955 342.0000
8  1956 397.3333
9  1957 451.3333
10 1958 477.0000
11 1959 526.3333
12 1960 587.6667
4)如果不需要NA行,则可以使用数据帧以及省略##行轻松完成此操作。(这使用基本R,但sqldf、dplyr或data.table可交替用于聚合和子集设置。)如果需要转换回ts,则
ts(DF$AP2,start=DF$year[1])


为什么?转换非常简单,处理数据帧(方法、工具、知识等)要好得多,只是尽量减少时间。。。假设转换/转换6700万个时间序列需要相当长的时间。。。现在,我正在使用并行软件包遍历一个时间序列列表,以获得一个列表列表,其中每个元素都是一个具有聚合值的列表…添加了更多解决方案。谢谢。。。我将尝试使用聚合的第一个选项。我将尝试在集群的parlappy中使用它,我有大约67m的时间序列,我想从中得到这种类型的聚合。所以我希望这样的方法能奏效:
vlistIf速度是一个问题,那么数据表的速度会更快。对于完整年份(或不需要NA填充的不完整年份),请在
DF
如(4):
库(data.table)中尝试此方法;as.data.table(DF)[6:8中的月份%,列表(AP2=平均值(AP2)),按=年]
。谢谢。。。我一直在使用data.table,只是作为数据源,我得到了一个包含67M ts对象的列表。现在,我实际上正在运行一种与您提到的方法非常相似的方法:将ts转换为data.frame,然后转换为数据表以获得聚合…这需要很长时间才能完成列表元素的数量(2天,使用Parlappy计算120个核)。所以我想知道避免“as.xxx”转换是否可以加快任务的速度……建议您在少量数据上对不同的方法进行基准测试,以确定什么是最快的。