Выберите группы с последовательными кварталами - PullRequest
0 голосов
/ 28 сентября 2018

Я надеюсь выбрать идентификаторы, имеющие последовательные записи за квартал года.Например, будет выбран идентификатор 111, потому что он имеет все кварталы года.Идентификатор 113 будет выбран, потому что комбинации года и квартала являются последовательными, хотя идентификатор имеет только часть общих кварталов года.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

Мой текущий код (ниже) может иметь дело только с выбором идентификаторов, которые имеют полные комбинации года и квартала.Интересно, как достичь желаемого результата.

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

Желаемый результат -

Identifer
111
113 

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Чтобы выбрать «Идентификаторы», преобразуйте «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, 1/4 для квартала 2 и т. Д.


Запись была улучшена благодаря комментариям @ G.Grothendieck.Спасибо!

0 голосов
/ 28 сентября 2018

Одним способом, мы могли бы сделать это, используя dplyr и lubridate вместе.Мы можем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...