[英]How to extract longitudinal time-series data from a dataframe in R for time-series analysis and imputation
[英]How to extract each year from a time-series data set in R
我有一個時間序列數據集EuStockMarket
。 它包含從 1991 年到 1998 年對四個股票市場的觀察結果。我想分別提取每一年。
data(EuStockMarkets)
str(EuStockMarkets)
試試這個,使用 tsibble package:
library(tsibble)
tsbl <- as_tsibble(EuStockMarkets)
tsbl %>%
group_by_key() %>%
index_by(year = ~ year(.))
# A tsibble: 7,440 x 4 [1s] <UTC>
# Key: key [4]
# Groups: key @ year [32]
index key value year
<dttm> <chr> <dbl> <dbl>
1 1991-07-01 02:18:33 DAX 1629. 1991
2 1991-07-02 12:00:00 DAX 1614. 1991
3 1991-07-03 21:41:27 DAX 1607. 1991
4 1991-07-05 07:22:55 DAX 1621. 1991
5 1991-07-06 17:04:22 DAX 1618. 1991
6 1991-07-08 02:46:21 DAX 1611. 1991
7 1991-07-09 12:27:49 DAX 1631. 1991
8 1991-07-10 22:09:16 DAX 1640. 1991
9 1991-07-12 07:50:44 DAX 1635. 1991
10 1991-07-13 17:32:11 DAX 1646. 1991
# ... with 7,430 more rows
問題中的輸入 EuStockMarkets 是 ts object,因此我們假設問題是查找具有每年一個組件的 ts 對象列表。 我們提供以下解決方案。 在每種情況下,年份都用作列表組成部分的名稱。
1) 動物園
從 ts 轉換為 zoo class 以便我們可以使用 split.zoo,按年份拆分(integer 部分時間是年份)並轉換回 ts。 (如果動物園對象列表沒問題,則省略 lapply。)
library(zoo)
lapply(split(as.zoo(EuStockMarkets), as.integer(time(EuStockMarkets))), as.ts)
2) 基地
此解決方案不如 (1) 緊湊,但如果您需要避免 package 依賴項,它不會使用任何依賴項。 它首先將時間向量拆分為年份,然后為每個組件使用 window 提取該年份的子系列,並給出 ts 對象的列表。
spl <- split(time(EuStockMarkets), as.integer(time(EuStockMarkets)))
Map(window, start = Map(min, spl), end = Map(max, spl), list(EuStockMarkets))
選項1
您可以拆分類似矩陣的ts
object 並通過Map()
重建每年的時間序列。 最終的 output 是一個包含 1991 年到 1998 年的ts
對象的列表。您可以使用$
符號來提取每年。
tm <- time(EuStockMarkets)
res1 <- Map(ts, split(as.data.frame(EuStockMarkets), floor(tm)),
tm[c(T, cycle(EuStockMarkets)[-1] == 1)],
frequency = frequency(EuStockMarkets))
選項 2
另一種不拆分數據的解決方案,可能會稍微提高效率。
cyc <- cycle(EuStockMarkets)[-1] ; tm <- time(EuStockMarkets)
res2 <- Map(window, list(EuStockMarkets), tm[c(T, cyc == 1)], tm[c(cyc == 1, T)])
names(res2) <- sapply(res2, start)[1, ]
Output
res1$`1991`
# Time Series:
# Start = c(1991, 130)
# End = c(1991, 260)
# Frequency = 260
# DAX SMI CAC FTSE
# 1991.496 1628.75 1678.1 1772.8 2443.6
# 1991.500 1613.63 1688.5 1750.5 2460.2
# 1991.504 1606.51 1678.6 1718.0 2448.2
# etc.
res1$`1998`
# Time Series:
# Start = c(1998, 1)
# End = c(1998, 169)
# Frequency = 260
# DAX SMI CAC FTSE
# 1998.000 4132.79 6044.7 2858.1 5049.8
# 1998.004 4132.79 6046.7 2874.1 5013.9
# 1998.008 4132.79 6046.7 2874.1 5013.9
# etc.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.