【问题标题】:How do I subset the last week for every month of a zoo object in R?如何在 R 中对每个月的动物园对象的最后一周进行子集化?
【发布时间】:2014-05-19 11:32:26
【问题描述】:

我有几年的每日价格数据作为动物园对象。在 R 中对“每个”月的最后一周进行子集化的最佳方法是什么?

复制它的方法如下:

set.seed(123)
price <- rnorm(365)
data <- cbind(seq(as.Date("2013-01-01"), by = "day", length.out = 365), price)
zoodata <- zoo(data[,2], as.Date(data[,1]))

我试过这个选项,但它只返回整个数据集的最后一周。

do.call(rbind, lapply(split(zoodata, "months"), last, "1 week"))

结果输出是:

2013-12-30 2013-12-31 
 1.0246732  0.8176594 

我希望得到每个月的最后一周,因此应该有至少 12 周的数据。

提前致谢!

【问题讨论】:

  • 请阅读this,了解如何为您的问题制作一个可重现的最小示例。您还应该展示到目前为止您已经尝试过的内容以及不成功的地方。
  • 感谢您的耐心等待。我添加了代码以使其可重现。

标签: r xts zoo


【解决方案1】:

这是使用 xts 包的一种方式

## Create sample data
library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix)
##

# split by month, and apply the last() function to each group
lapply(split(x, "months"), last, "1 week") 

如果您希望结果是单个对象,您可以使用rbind 列表使用do.call

do.call(rbind, lapply(split(x, "months"), last, "1 week"))
               Open     High      Low    Close
2007-01-29 49.85624 49.93038 49.76308 49.91875
2007-01-30 49.85477 50.02180 49.77242 50.02180
2007-01-31 50.07049 50.22578 50.07049 50.22578
2007-02-26 50.88168 50.88168 50.75481 50.75481
2007-02-27 50.74333 50.78909 50.61874 50.69206
2007-02-28 50.69435 50.77091 50.59881 50.77091
2007-03-26 48.34210 48.44637 48.28969 48.28969
2007-03-27 48.25248 48.41572 48.23648 48.30851
2007-03-28 48.33090 48.53595 48.33090 48.53595
2007-03-29 48.59236 48.69988 48.57432 48.69988
2007-03-30 48.74562 49.00218 48.74562 48.93546
2007-03-31 48.95616 49.09728 48.95616 48.97490
2007-04-30 49.13825 49.33974 49.11500 49.33974
2007-05-28 47.90142 47.93398 47.64718 47.64718
2007-05-29 47.65665 47.89342 47.65446 47.87252
2007-05-30 47.78866 47.93267 47.78866 47.83291
2007-05-31 47.82845 47.84044 47.73780 47.73780
2007-06-25 47.20471 47.42772 47.13405 47.42772
2007-06-26 47.44300 47.61611 47.44300 47.61611
2007-06-27 47.62323 47.71673 47.60015 47.62769
2007-06-28 47.67604 47.70460 47.57241 47.60716
2007-06-29 47.63629 47.77563 47.61733 47.66471
2007-06-30 47.67468 47.94127 47.67468 47.76719

注意:如果它很重要,可以将as.zoo() 包裹起来,但xts 对象是zoo 对象,因此可能没有必要。

【讨论】:

  • 谢谢 GSee。我尝试了您的修复,但它对我不起作用。我只得到全年的最后一周。我在原始条目中添加了代码以使其可重现。
  • @user3584057 您需要先转换为xtsx &lt;- as.xts(zoodata)
  • 知道了。这很干净:do.call(rbind, lapply(split(as.xts(zoodata), "months"), last, "1 week")) -- 谢谢!
【解决方案2】:

试试

lapply(split(as.xts(zoodata), "months"), FUN = function(x) last(x,"1 week"))

这将给出每个月的最后 1 周。 (但数据将在月底结束,因为该月的最后一天可以在一周中的任何一天结束)

【讨论】:

  • 我正在寻找的确切解决方案;工作得很好。谢谢!
  • 和我的一样,但按键次数更多。
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多