我是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个数据点。这可能吗?
我希望我清楚我所面临的问题。非常感谢大家,以及更好地理解循环和列表的任何提示/技巧。
答案 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)
合并.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是您最好的朋友”或发布其他问题: - )