将xts按年份子集到列表中。将年份和月份的xts设置为列表

时间:2018-02-04 15:08:56

标签: r xts quantmod

我是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-loop一样?

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

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

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

我希望我清楚我所面临的问题。非常感谢大家,以及更好地理解循环和列表的任何提示/技巧。

3 个答案:

答案 0 :(得分:0)

第一个问题是这样的吗?

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])

答案 1 :(得分:0)

我们可以直接从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

答案 2 :(得分:0)

合并.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是您最好的朋友”或发布其他问题: - )