按年份将 xts 子集放入列表中。按年份和月份将 xts 子集放入列表中

Subset an xts by year into a list. Subset an xts by year and month into a list

我是 R 和堆栈平台的新手。

sti <- getSymbols("^STI", src = "yahoo", auto.assign = F, from = "2007-01-01", to = "2017-12-31")
sti_adjusted <- sti[, 6]

我这样做是为了将数据子集化为年份列表。

ls_sti_adjusted <- list(sti_adjusted["2007"], sti_adjusted["2008"], sti_adjusted["2009"], sti_adjusted["2010"], sti_adjusted["2011"], sti_adjusted["2012"], sti_adjusted["2013"], sti_adjusted["2014"], sti_adjusted["2015"], sti_adjusted["2016"], sti_adjusted["2017"])

我正在寻找更优雅的解决方案,比如 for 循环?

ls_sti_adjusted <- list()
for (i in 2007:2017){
ls_sti_adjusted[[]] <- ???
}

第二个问题是如何将元素进一步细分为一年中的月份?

例如:ls_sti_adjusted[[1]][[2]][[3]] returns 2007 年 2 月的第 3 个数据点。这可能吗?

我希望我清楚我面临的问题。谢谢大家,如果 tips/tricks 能更好地理解循环和列表,我们将不胜感激。

第一个问题是这样的吗?

library(lubridate)
index(sti_adjusted)=floor_date(index(sti_adjusted),unit="years")
ls_sti_adjusted <- lapply(unique(index(sti_adjusted)),function(x) sti_adjusted[index(sti_adjusted)==x,1])

我们可以直接使用 xts 的索引,检查 ?index.xts:

split(sti_adjusted, .indexyear(sti_adjusted))

为了保持2012,2013,...的正确命名,我们可以试试:

split(sti_adjusted, as.integer(format(index(sti_adjusted), '%Y')))

当然这可以嵌套在一个列表中,只要你想:

nestedList <- lapply(
  split(sti_adjusted, .indexyear(sti_adjusted))
  , function(x) split(x, .indexmon(x))
)
nestedList[[3]][[2]][3] #3.year, 2.month, 3. obs.

示例使用来自 xts 的内置数据:

data(sample_matrix, package = "xts")
sample_matrix <- as.xts(sample_matrix)

nestedList <- lapply(
  split(sample_matrix, .indexyear(sample_matrix))
  , function(x) split(x, .indexmon(x))
)
nestedList[[1]][[3]][5]
               Open    High      Low    Close
2007-03-05 50.26501 50.3405 50.26501 50.29567

组合 .indexyearsplit(x,f = “months” 将为您提供所需的列表。

lapply(unique(.indexyear(STI)),function(x) split.xts(STI[.indexyear(STI) == x ,],f='months’))

如果您只需要年度列表,请省略 split 部分,如下所示:

lapply(unique(.indexyear(STI)),function(x) STI[.indexyear(STI) == x ,])

更新:OP 关于列表命名的后续问题

假设您将列表列表对象命名为 STIlist 您可以执行以下操作按年份命名列表。(请记住,名称已转换为字符串!)

names(STIlist) <- 2007:2018

要获取 2007 年的列表:

> both(STIlist[['2007']])
           STI.Open STI.High STI.Low STI.Close STI.Volume STI.Adjusted
2007-01-03  3015.74  3037.74 3010.22   3037.74  192739200      3037.74
2007-01-04  3035.08  3045.18 3008.23   3023.80  198216700      3023.80
2007-01-05  3031.09  3038.27 3000.50   3029.04  233321400      3029.04
           STI.Open STI.High STI.Low STI.Close STI.Volume STI.Adjusted
2007-12-27  3469.11  3491.65 3459.97   3477.20   91474200      3477.20
2007-12-28  3452.18  3463.38 3441.96   3445.82  109442100      3445.82
2007-12-31  3424.48  3482.30 3424.48   3482.30  205741900      3482.30

如果您需要有关命名列表的更多信息“Google 是您最好的朋友”或post 另一个问题:-)