2017-08-17 3 views
1

J'ai des données qui ressemble à ceSubset dataframe base des dates non séquentielles

df<-data.frame(datecol=as.Date(c("2010-04-03","2010-04-04","2010-04-05","2010-04-06","2010-04-07", 
            "2010-04-03","2010-04-04","2010-04-05","2010-04-06","2010-04-07", 
            "2010-05-06","2010-05-07","2010-05-09","2010-06-06","2010-06-07")),x=c(1,1,1,0,1,1,1,0,0,0,1,0,0,0,1),type=c(rep("A",5),rep("B",5),rep("C",5))) 

> df 
     datecol x type 
1 2010-04-03 1 A 
2 2010-04-04 1 A 
3 2010-04-05 1 A 
4 2010-04-06 0 A 
5 2010-04-07 1 A 
6 2010-04-03 1 B 
7 2010-04-04 1 B 
8 2010-04-05 0 B 
9 2010-04-06 0 B 
10 2010-04-07 0 B 
11 2010-05-06 1 C 
12 2010-05-07 0 C 
13 2010-05-09 0 C 
14 2010-06-06 0 C 
15 2010-06-07 1 C 

je dois sous-ensemble cette trame de données par type, où je ne garde que les « types » qui ont 2 ou plusieurs dates et ces dates sont au moins 1 jour d'intervalle. Dans l'exemple ci-dessus, le type A a 4 dates différentes, et le type C a 2 dates différentes qui sont distantes de plus d'un jour, donc je veux les enregistrer comme une nouvelle base de données. Le type B a 2 dates différentes, mais elles ne sont pas à 1 jour d'intervalle, donc je ne veux pas le garder.

Je pensais faire en boucle compter combien de dates uniques sont dans chaque type, laissez tout ce qui a plus de 2 dates différentes. Ensuite, je regarderais ceux qui n'ont que deux dates différentes et calculer la distance entre eux et ne laisser que ceux où la distance est supérieure à 1. Mais il semble qu'il devrait y avoir un moyen plus efficace. Des idées?

Répondre

2

Une solution avec data.table:

#make sure datecol is Date 
df$datecol <- as.Date(df$datecol) 

library(data.table) 
#x needs to be 1 and the date difference more than a day per type 
#then in the second [] we select the TRUEs 
setDT(df)[x == 1, diff(datecol) > 1, by = type][V1 == TRUE, type] 
#[1] A C 
#Levels: A B C 
+0

génial, merci! :) – Liza

+0

Vous êtes les bienvenus :) – LyzandeR