选择具有连续季度的组

时间:2018-09-28 18:04:39

标签: r date

我希望选择具有连续的季度记录的标识符。例如,将选择ID 111,因为它具有所有季度。选择ID 113是因为该年-季度组合是连续的,尽管该ID仅占总年-季度的一部分。由于年份季度不是连续的,因此将不会选择ID 112。它缺少201601、201602、201603。

Identifer   year-quarter
111          201503
111          201504
111          201601
111          201602
111          201603
111          201604
112          201503
112          201504
112          201604
113          201503
113          201504
113          201601

我当前的代码(如下)只能处理选择具有完整年度-季度组合的ID。我想知道如何实现我想要的结果。

df2 = group_by(df1, Identifer) %>% summarize(total = n()) %>% filter(total =6)

期望的结果是

Identifer
111
113 

2 个答案:

答案 0 :(得分:2)

要选择“标识符”,请将“ year.quarter”转换为zoo::year.qtr,按组取连续值之间的差,检查所有差是否均为0.25 *。

library(zoo)
tapply(as.yearqtr(as.character(d$year.quarter), format = "%Y%q"), d$Identifer,
       FUN = function(x) all(diff(as.numeric(x)) == 0.25))

# 111   112   113 
# TRUE FALSE  TRUE

要选择相应的行,请对ave使用类似的逻辑:

d[as.logical(ave(as.yearqtr(as.character(d$year.quarter), format = "%Y%q"), d$Identifer,
                 FUN = function(x) all(diff(x) == 0.25))), ]
#    Identifer year.quarter
# 1        111       201503
# 2        111       201504
# 3        111       201601
# 4        111       201602
# 5        111       201603
# 6        111       201604
# 10       113       201503
# 11       113       201504
# 12       113       201601

*来自?as.yearqtr

  

yearqtr”类用于表示季度数据。在内部,它保存数据为年份,第一季度为0,第二季度为1/4,依此类推


该帖子通过@ G.Grothendieck的评论得到了改进。谢谢!

答案 1 :(得分:1)

一种方法,我们可以通过同时使用dplyrlubridate来做到这一点。我们可以group_by Identifier并使用yq函数将年季转换为日期,然后取连续日期之间的差,并获得所有日期均在90范围内的所有组。 -120是我们可以允许的四分之一之间的最大天数。

library(dplyr)
library(lubridate)

df %>%
  group_by(Identifer) %>%
  mutate(yearq = c(90, diff(yq(year.quarter)))) %>%
  filter(all(yearq > 89 & yearq < 120)) %>%
  select(Identifer) %>%
  unique()

#   Identifer
#      <int>
#1       111
#2       113