我在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天或最近的观测值。
我的数据集如下:
答案 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