2016-08-20 4 views
3

Je veux vérifier le chevauchement des données, voici les donnéesVérifiez chevauchement heure de début et de fin par groupe R

ID <- c(rep(1,3), rep(3, 5), rep(4,4),rep(5,5)) 
Begin <- c(0,2.5,3,7,8,7,25,25,10,15,17,20,1,NA,10,11,13) 
End <- c(1.5,3.5,6,12,8,11,29,35, 12,19,NA,28,5,20,30,20,25) 
df <- data.frame(ID, Begin, End) 
df 
    ID Begin End 
1 1 0.0 1.5 
2 1 2.5 3.5 
3 1 3.0 6.0* 
4 3 7.0 12.0 
5 3 8.0 8.0* 
6 3 7.0 11.0* 
7 3 25.0 29.0 
8 3 25.0 35.0* 
9 4 10.0 12.0 
10 4 15.0 19.0 
11 4 17.0 NA* 
12 4 20.0 28.0 
13 5 1.0 5.0 
14 5 NA 20.0 
15 5 10.0 30.0 
16 5 11.0 20.0* 
17 5 13.0 25.0* 

* signifie qu'il est chevauchement:

  • pour la ligne 3, ID = 1, Begin = 3.0 est plus petit que 3.5, donc Begin_New = 3.5, mais
  • alors que ID = 3, c'est différent, la rangée 5 Begin = 8.0 est plus petite que 12.0, nous initialisons Begin_New = 12, mais ça continue, si on compare Commencer = 7.0 avec End = 8.0, ce n'est pas correct, parce que maintenant End est 12 est plus haut next valeur.

Voici donc ma conception de sortie

ID Begin End Begin_New1 
1 1 0.0 1.5  0.0 
2 1 2.5 3.5  2.5 
3 1 3.0 6.0  3.5* 
4 3 7.0 12.0  7.0 
5 3 8.0 8.0  12.0* 
6 3 7.0 11.0  12.0* 
7 3 25.0 29.0  25.0 
8 3 25.0 35.0  29.0* 
9 4 10.0 12.0  10.0 
10 4 15.0 19.0  15.0 
11 4 17.0 NA  19.0* 
12 4 20.0 28.0  20.0 
13 5 1.0 5.0  1.0 
14 5 NA 20.0   NA 
15 5 10.0 30.0  20.0* 
16 5 11.0 20.0  30.0* 
17 5 13.0 25.0  30.0* 

Lorsque j'utilise ce code, je ne reçois pas la sortie que je veux, ce seul changement 1 ligne et comparer chaque ligne

setDT(df)[, Begin_New := shift(End), by = ID][!which(Begin < Begin_New), Begin_New:= Begin] 
    ID Begin End Begin_New 
1: 1 0.0 1.5  0.0 
2: 1 2.5 3.5  2.5 
3: 1 3.0 6.0  3.5 
4: 3 7.0 12.0  7.0 
5: 3 8.0 8.0  12.0 
6: 3 7.0 11.0  8.0 
7: 3 25.0 29.0  25.0 
8: 3 25.0 35.0  29.0 
9: 4 10.0 12.0  10.0 
10: 4 15.0 19.0  15.0 
11: 4 17.0 NA  19.0 
12: 4 20.0 28.0  20.0 
13: 5 1.0 5.0  1.0 
14: 5 NA 20.0  NA 
15: 5 10.0 30.0  20.0 
16: 5 11.0 20.0  30.0 
17: 5 13.0 25.0  20.0 
Ce

est la sortie que je ne veux pas

+0

j'ajouter une ligne setDT (df) [, Begin_New1: = décalage (Begin_New), par = ID] [qui (Begin_New BIN

Répondre

6

Je pense que votre code est à peu près droit, il vous suffit d'utiliser cummax:

df[, Begin_New := { 
    high_so_far = shift(cummax(End), fill=Begin[1L]) 
    w   = which(Begin < high_so_far) 
    Begin[w] = high_so_far[w] 

    Begin 
}, by=ID] 
+0

Ah ok, oui, si 'End' est garanti d'augmenter, alors vous n'avez pas besoin de cummax. – Frank

+1

votre code est en sécurité si je frappe une autre situation – BIN