在R中使用xts获取每周的第一天和最后一天
我在这本书中读到了这个奇妙的解决方案。我想得到两个时间序列对象。一个用于每周的第一天,另一个用于每周的最后一天。我的时间序列是不规则的,不包括周末和假期。星期从星期一到星期天。以下是我的系列文章:在R中使用xts获取每周的第一天和最后一天,r,time-series,xts,R,Time Series,Xts,我在这本书中读到了这个奇妙的解决方案。我想得到两个时间序列对象。一个用于每周的第一天,另一个用于每周的最后一天。我的时间序列是不规则的,不包括周末和假期。星期从星期一到星期天。以下是我的系列文章: Date Val WeekNum 1 01/02/1990 41.38 1 2 02/02/1990 42.88 1 3 05/02/1990 42.00 2 4 06/02/1990 41.50 2 5 07/02/19
Date Val WeekNum
1 01/02/1990 41.38 1
2 02/02/1990 42.88 1
3 05/02/1990 42.00 2
4 06/02/1990 41.50 2
5 07/02/1990 42.25 2
6 08/02/1990 41.75 2
7 09/02/1990 42.13 2
8 12/02/1990 42.13 3
9 13/02/1990 42.00 3
10 14/02/1990 42.63 3
11 15/02/1990 43.75 3
12 16/02/1990 44.75 3
13 20/02/1990 44.13 4
14 21/02/1990 43.88 4
15 22/02/1990 44.38 4
16 23/02/1990 44.00 4
17 26/02/1990 44.00 5
18 27/02/1990 44.88 5
19 28/02/1990 44.50 5
20 01/03/1990 44.63 5
21 02/03/1990 46.00 5
22 05/03/1990 45.88 6
23 06/03/1990 45.50 6
24 07/03/1990 45.38 6
25 08/03/1990 43.63 6
26 09/03/1990 41.50 6
27 12/03/1990 41.38 7
28 13/03/1990 40.63 7
29 14/03/1990 40.25 7
30 15/03/1990 40.50 7
31 16/03/1990 40.50 7
32 19/03/1990 40.25 8
33 20/03/1990 39.88 8
34 21/03/1990 39.75 8
35 22/03/1990 38.50 8
36 23/03/1990 38.75 8
37 26/03/1990 39.63 9
38 27/03/1990 39.75 9
然后我从参考文章中使用:
library(xts)
do.call(rbind, lapply(split(x, "weeks"), function(x) x[1]))
编辑:它不起作用,因为我有截至zoo的数据,而不是xts。您可以使用
.indexwday
获取日周数。然后使用range
获得第一个和最后一个。因为,并非所有的周都从周一开始,到周五结束,所以最好取每周的最小值和最大值
要获得每周的第一天和最后一天,您可以执行以下操作:
do.call(rbind, lapply(split(dat.xts, "weeks"),
function(y) y[.indexwday(y) %in% range(.indexwday(y))]))
Val WeekNum
1990-02-01 41.38 1
1990-02-02 42.88 1
1990-02-05 42.00 2
1990-02-09 42.13 2
1990-02-12 42.13 3
1990-02-16 44.75 3
1990-02-20 44.13 4
1990-02-23 44.00 4
1990-02-26 44.00 5
1990-03-02 46.00 5
1990-03-05 45.88 6
1990-03-09 41.50 6
1990-03-12 41.38 7
1990-03-16 40.50 7
1990-03-19 40.25 8
1990-03-23 38.75 8
1990-03-26 39.63 9
1990-03-27 39.75 9
只需使用
first
和last
功能即可。您还可以使用头部
和尾部
# first/last
do.call(rbind, lapply(split(x, "weeks"), first))
do.call(rbind, lapply(split(x, "weeks"), last))
# head/tail
do.call(rbind, lapply(split(x, "weeks"), head, 1))
do.call(rbind, lapply(split(x, "weeks"), tail, 1))
你还不明白什么?@Joshua Ulrich我从中只得到了一个值,但我希望得到的值与系列中周一或周五的值一样多。如果星期一或星期五不见了,那也行吗?你需要澄清你想要的结果是什么。你想要每周的第一次/最后一次观察,还是想要周一/周五的观察?@Joshua Ulrich我想要每周的第一次周一/周五,如果其中任何一次是假期,那么选择周二/周四,以此类推。我指的是假期时丢失的数据。非常感谢,效果非常好。我接受约书亚·乌尔里奇的解决方案,因为这对我来说稍微容易一点。@eccehomo没问题。我也是,我更喜欢其他的解决方案。