2017-05-08 2 views
0

Voici un exemple de mon data.frame:lignes de décalage par groupe de delta généré aléatoire t

df = read.table(text = 'ID Day 
101 0 
101 0 
101 1 
300 40 
300 40 
270 32 
270 35 
100 1450 
100 1450 
100 1451 
72 1490 
72 1499', header = TRUE) 

En supposant que chaque Day obs représente une date réelle et que les plages de la période de temps de Day = 0 à Day = 1500, je besoin de changer chaque groupe ID d'une quantité aléatoire de Day (delta t), spécifique pour chaque groupe et si passe 1500 démarrage à nouveau la valeur de 0. Day

par exemple, groupe 101 par 30 jour, le groupe 300 par 70, le groupe 270 de 1000, le groupe 100 100 et le groupe 72 de 5

Voici ma souhaitée sortie:

 ID Day 
    101 30 
    101 30 
    101 31 
    300 110 
    300 110 
    270 1032 
    270 1035 
    100 1550 
    100 1550 
    100 1551 
    72 1495 
    72 3 

On notera que le déplacement de Day par chaque groupe doit être aléatoire.

Toute aide serait vraiment appréciée.

Merci

+0

Je ne sais pas si je l'ai eu, mais avec 'data.table' vous pouvez essayer' setDT (df) [, Day_new: = (jour + runif (uniqueN (ID), 0,1500)) %% 1500, par = ID] '. – nicola

+0

désolé mais cela ne fonctionne pas, merci quand même – aaaaa

+0

Je crois que l'astuce consiste à ajouter les nombres aléatoires à chaque jour dans chaque groupe d'ID – aaaaa

Répondre

0
library(dplyr) 

set.seed(123) 

df2 <- df %>% 
    group_by(ID) %>% 
    mutate(Day = (Day + sample(1:1000, 1)) %% 1500) 
2

Cela ajoutera un nombre entier aléatoire entre 0 et 1000 à chaque jour - vous pouvez régler les limites de sample en fonction de ce que vous avez besoin.

library(dplyr) 

set.seed(123) 

df2 <- df %>% 
    group_by(ID) %>% 
    mutate(Day = (Day + sample(1:1000, 1)) %% 1500) 

df2  
# ID Day 
# 101 409 
# 101 409 
# 101 410 
# 300 981 
# 300 981 
# 270 916 
# 270 919 
# 100 739 
# 100 739 
# 100 740 
# 72 278 
# 72 287 
+0

lisse comme un oeuf, merci – aaaaa

+0

désolé mais j'ai eu des valeurs négatives jour ... pourquoi? – aaaaa

+0

pouvez-vous montrer les valeurs avant et après qui donnent les nombres négatifs? En 'mutate' vous pourriez faire de la nouvelle variable un nom différent (disons' Day2') qui pourrait vous aider à dépanner – Craig