【问题标题】:How to subset dataframe on dates?如何在日期上对数据框进行子集化?
【发布时间】:2019-12-28 22:46:00
【问题描述】:

我在 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 天的最后一次观察。

我的数据集如下所示:

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。不要发布数据图片,因为我们无法轻松将其导入 R。而是分享一小部分 dput() 数据。
  • 您的数据在某一天是否可以有多个观察值?
  • @MrFlick 将尝试这样做。
  • @KevinTroy 每秒(ID)每天只有一次观察。但是有多个secid,因此同一天会有多个观测值。

标签: r date subset


【解决方案1】:

这里有两种可能的解决方案。第一个快速但不精确,因为您可以提取每个日期的日期并从 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

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 2020-10-17
    • 2017-08-23
    • 2013-10-25
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多