按年份将 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
组合 .indexyear
和 split(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 另一个问题:-)
我是 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
组合 .indexyear
和 split(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 另一个问题:-)