问题描述
我有一个像这样的data.frame:
df <- data.frame(cik = c(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','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,9,8,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时,以前的解决方案不再起作用,将不胜感激。预先感谢!
解决方法
您已经很正确地找到了您所提到的答案。
缺少的只是在将日期放入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
会将您的数据放入连续日期的块中。通过仅在cumsum
上增加diff > 1
,上述解决方案对于您的特定情况也很可靠,在这种情况下,每个日期和cik似乎允许多个观察值(例如,“ 2007-02-01” )。
但是,我还对过滤器进行了调整,以便在没有至少5个不同日期的情况下将其排除在外(使用n_distinct(date)
而不是简单的n()
) ,这意味着您至少要有5天的时间。
然后由您决定如何在窗口中处理重复的观察结果...