子集 xts 的更快方法
Faster way to subset xts
我有一个很大的 xts
,我想按月份和日期过滤每年的礼物。
library(xts)
junk <- xts(sample.int(101, size = 1461, replace = T), seq(as.Date('2006-01-01'), as.Date('2009-12-31'), 'days'))
junk_sma10 = TTR::SMA(x = junk, n = 10) ## trailing 10 day avg
现在我正在通过一个循环来获取每天和每月的值,这需要一段时间。我知道 R 更擅长一次处理向量。
months_filtered <- idx_apcp30[.indexmon(junk_sma10) == 1] ## filter for feb
final_filtered <- months_filtered[.indexmday(months_filtered) == 15] ## filter for 16th
输出是一年中每一天的唯一 xts。
SMA
2006-02-16 61.0
2007-02-16 50.5
2008-02-16 60.5
2009-02-16 54.1
然后下一次迭代(+1 mday)将产生
SMA
2006-02-17 64.3
2007-02-17 48.4
2008-02-17 66.1
2009-02-17 48.6
我需要生成并存储此过程生成的每个 xts。我如何不在循环中执行此操作?
我找到了这样的解决方案:
junk[seq(as.Date('2006-01-01'),as.Date('2009-12-31'),by='year')]
但我仍然需要每天迭代...
一个简单的解决方案是 split
您的 xts 对象按月和日分成块。
# if using xts < 0.10-0 (bug work-around)
month_day <- split(junk_sma10, as.numeric(format(index(junk_sma10), "%m%d")))
# requires xts >= 0.10-0
month_day <- split(junk_sma10, format(index(junk_sma10), "%m%d"))
现在 month_day
是一个列表,其中每个元素都是每年相同的月份和日期。然后您可以使用 lapply
对每个列表元素调用一个函数来继续您的分析。
我有一个很大的 xts
,我想按月份和日期过滤每年的礼物。
library(xts)
junk <- xts(sample.int(101, size = 1461, replace = T), seq(as.Date('2006-01-01'), as.Date('2009-12-31'), 'days'))
junk_sma10 = TTR::SMA(x = junk, n = 10) ## trailing 10 day avg
现在我正在通过一个循环来获取每天和每月的值,这需要一段时间。我知道 R 更擅长一次处理向量。
months_filtered <- idx_apcp30[.indexmon(junk_sma10) == 1] ## filter for feb
final_filtered <- months_filtered[.indexmday(months_filtered) == 15] ## filter for 16th
输出是一年中每一天的唯一 xts。
SMA
2006-02-16 61.0
2007-02-16 50.5
2008-02-16 60.5
2009-02-16 54.1
然后下一次迭代(+1 mday)将产生
SMA
2006-02-17 64.3
2007-02-17 48.4
2008-02-17 66.1
2009-02-17 48.6
我需要生成并存储此过程生成的每个 xts。我如何不在循环中执行此操作?
我找到了这样的解决方案:
junk[seq(as.Date('2006-01-01'),as.Date('2009-12-31'),by='year')]
但我仍然需要每天迭代...
一个简单的解决方案是 split
您的 xts 对象按月和日分成块。
# if using xts < 0.10-0 (bug work-around)
month_day <- split(junk_sma10, as.numeric(format(index(junk_sma10), "%m%d")))
# requires xts >= 0.10-0
month_day <- split(junk_sma10, format(index(junk_sma10), "%m%d"))
现在 month_day
是一个列表,其中每个元素都是每年相同的月份和日期。然后您可以使用 lapply
对每个列表元素调用一个函数来继续您的分析。