【问题标题】:Keep only consecutive monthly, atleast x months of data仅保留连续每月,至少 x 个月的数据
【发布时间】:2020-12-30 00:19:41
【问题描述】:

我有一个这样的data.frame:

df <- data.frame(cik = c(1800,1800,1800,1800,1800,1800,1800,1800,1800,1800,1800,1800,1800,1800,1800), date = c('2000/01/01','2000/02/01','2000/03/01','2000/04/01','2000/05/01','2000/06/01','2007/02/01','2007/02/01','2009/03/01','2009/04/01','2018/05/01','2018/06/01','2018/07/01','2018/08/01','2018/09/01'), value = c(2,1,3,6,5,4,7,5,9,3,9,8,7,6,8))
df <- df %>% mutate(date = as.Date(date, formate="%Y/%m/%d"))

df
cik     date        value
1800    2000-01-01  2       
1800    2000-02-01  1       
1800    2000-03-01  3       
1800    2000-04-01  6       
1800    2000-05-01  5       
1800    2000-06-01  4       
1800    2007-02-01  7       
1800    2007-02-01  5       
1800    2009-03-01  9       
1800    2009-04-01  3       
1800    2018-05-01  9       
1800    2018-06-01  8       
1800    2018-07-01  7       
1800    2018-08-01  6       
1800    2018-09-01  8   

这是一个面板数据集,所以有更多的cik,这只是为了说明。

我想对这个数据集做两件事。首先,我想找到所有至少有 5 次连续观察的cik(在我的真实数据集中,我想要至少 24 次连续观察,但 5 只是为了说明目的。其次,我想保留所有行这是 24 次连续观察的一部分。所以我想要的最终结果是:

df
cik     date        value
1800    2000-01-01  2       
1800    2000-02-01  1       
1800    2000-03-01  3       
1800    2000-04-01  6       
1800    2000-05-01  5       
1800    2000-06-01  4           
1800    2018-05-01  9       
1800    2018-06-01  8       
1800    2018-07-01  7       
1800    2018-08-01  6       
1800    2018-09-01  8   

我已经尝试了这个post 的解决方案,并结合了其他帖子但找不到答案。似乎当我转换为 yearmonth 时,以前的解决方案不再有效,任何帮助都会受到赞赏。提前致谢!

【问题讨论】:

  • 欢迎来到 SO。我建议修改这个问题,因为它不清楚,您期望的输出与输入相同,不包括 2007 年和 2009 年。为什么这两年被排除在期望的输出之外?除此之外,还要显示您尝试过的内容(即代码),即使它不正确。

标签: r dataframe dplyr panel-data date-difference


【解决方案1】:

您提到的答案已经完全走在正确的轨道上。
所缺少的只是用lubridate::ydm 解析日期,然后将其放入diff 函数中。
试试这个:

library(dplyr)
library(lubridate)

df %>%
  mutate(
    date = ydm(date)
  ) %>%
  arrange(cik, date) %>%
  group_by(cik, grp = cumsum(c(1, diff(date) > 1))) %>%
  filter(n_distinct(date) >= 5) %>%
  ungroup() %>%
  select(-grp)

grp 会将您的数据放在连续日期块中。通过仅在 diff &gt; 1 上增加 cumsum,上述解决方案也适用于您的特定情况,即每个日期和 cik 似乎允许多次观察(例如在“2007-02-01”)。
但是,我还调整了过滤器,因此如果它没有至少 5 个不同日期(使用n_distinct(date) 而不是简单的n()),它确实会排除一个组,这意味着你是确保有至少 5 天的窗口期。
然后由您决定如何处理窗口中的重复观察...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多