2 votes

Choisir des groupes dont les trimestres d'exercice sont consécutifs

J'espère pouvoir choisir les identifiants qui ont des enregistrements consécutifs d'une année à l'autre. Par exemple, l'identifiant 111 sera sélectionné parce qu'il a tous les trimestres de l'année. L'identifiant 113 sera sélectionné parce que les combinaisons de trimestres sont consécutives, bien que l'identifiant ne possède qu'une partie du total des trimestres. L'identifiant 112 ne sera pas sélectionné parce que les quarts d'année ne sont pas consécutifs. Il lui manque 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

Mon code actuel (ci-dessous) ne peut traiter que la sélection des ID qui ont les combinaisons année/trimestre complètes. Je me demande comment atteindre le résultat que je souhaite.

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

Le résultat souhaité est

Identifer
111
113

2voto

Henrik Points 12148

Pour sélectionner 'Identificateurs', convertissez 'année.trimestre' en zoo::year.qtr prendre la différence entre les valeurs consécutives par groupe, vérifier si toutes les différences sont de 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

Pour sélectionner les lignes correspondantes, utilisez une logique similaire avec 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

*Du ?as.yearqtr :

Le " yearqtr La classe " " est utilisée pour représenter les données trimestrielles. En interne, elle contient les données sous forme d'année plus 0 pour le premier trimestre, 1/4 pour le deuxième trimestre et ainsi de suite.


Ce billet a été amélioré par les commentaires de @G.Grothendieck. Merci !

1voto

Ronak Shah Points 24715

Une façon d'y parvenir est d'utiliser la fonction dplyr y lubridate ensemble. Nous pouvons group_by Identifier et utiliser yq pour convertir l'année et le trimestre en date, puis prendre la différence entre ces dates consécutives et obtenir tous les groupes où toutes les dates se situent dans la fourchette 90-120 comme nombre maximum de jours que nous pouvons autoriser entre un trimestre.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X