如何对日期的数据框进行子集化?

时间:2019-08-23 15:26:22

标签: r date subset

我在R中有一个面板数据框,其中包含很多行。我希望将数据框子集化为仅包含每月的最后10天(或月末前10天的最后观察)。但是,月份各不相同,并且并非所有月份都包含月末观察值。我需要数据的一个子集来包含最后10或5天的每个月。

CIV50s = CIV50sub %>%
  select(cusip, date, impl_volatility) %>%
  group_by(year(date), month(date), cusip) %>%
  summarize(impl_volatility = tail(impl_volatility, 1)) %>% 
  mutate(date = make_date(`year(date)`, `month(date)`))

我已经尝试过了。但是,这只给了我每月的最后一天。我需要月底前10天的最后10天或最近的观测值。

我的数据集如下:

enter image description here

1 个答案:

答案 0 :(得分:0)

这是两种可能的解决方案。第一种是快速但不精确的方法,因为您可以提取每个日期的日期并从21开始过滤。但是,由于几个月的时长不同,所以这并不完全有效。

library(dplyr)
library(lubridate)

df <- data.frame(t=seq(ymd('2018-01-01'),ymd('2019-01-01'),by='days'))

#extract day of month
df$day <- as.numeric(format(df$t,'%d'))

df %>% filter(day>=20) # can change this to 21 or other number

             t day
1   2018-01-20  20
2   2018-01-21  21
3   2018-01-22  22
4   2018-01-23  23
5   2018-01-24  24
6   2018-01-25  25
7   2018-01-26  26

另一个选择是增加每个月的时长,找到最近的10天,然后根据差异进行过滤。如果您在每个月的最后几天都缺少日期,则两种方法都可以使用。

df %>% mutate(month=as.numeric(format(t,'%m')),
              month.length=case_when(month %in% c(1,3,5,7,8,10,12)~31,
                         month==2~28,
                         TRUE~30),
              diff=month.length-day) %>% 
  filter(diff<=10)

             t day month month.length diff
1   2018-01-21  21     1           31   10
2   2018-01-22  22     1           31    9
3   2018-01-23  23     1           31    8
4   2018-01-24  24     1           31    7
5   2018-01-25  25     1           31    6
6   2018-01-26  26     1           31    5
7   2018-01-27  27     1           31    4
8   2018-01-28  28     1           31    3
9   2018-01-29  29     1           31    2
10  2018-01-30  30     1           31    1
11  2018-01-31  31     1           31    0
12  2018-02-18  18     2           28   10
13  2018-02-19  19     2           28    9
14  2018-02-20  20     2           28    8
15  2018-02-21  21     2           28    7
16  2018-02-22  22     2           28    6
相关问题