2016-06-23 21 views
5

Takma tarihe göre gruplandırmaya çalışıyorum.R/d grubundaki gruplara göre gecikme/yönlendirme

veri:

df <- data.frame(Team = c("A", "A", "A", "A", "B", "B", "B", "C", "C", "D", "D"), 
      Date = c("2016-05-10","2016-05-10", "2016-05-10", "2016-05-10", 
         "2016-05-12", "2016-05-12", "2016-05-12", 
         "2016-05-15","2016-05-15", 
         "2016-05-30", "2016-05-30"), 
      Points = c(1,4,3,2,1,5,6,1,2,3,9) 
      ) 

Team  Date  Points 
A  2016-05-10  1 
A  2016-05-10  4 
A  2016-05-10  3 
A  2016-05-10  2 
B  2016-05-12  1 
B  2016-05-12  5 
B  2016-05-12  6 
C  2016-05-15  1 
C  2016-05-15  2 
D  2016-05-30  3 
D  2016-05-30  9 

Beklenen sonuç:

Team  Date  Points Date_Lagged 
A  2016-05-10  1   NA 
A  2016-05-10  4   NA 
A  2016-05-10  3   NA 
A  2016-05-10  2   NA 
B  2016-05-12  1  2016-05-10 
B  2016-05-12  5  2016-05-10 
B  2016-05-12  6  2016-05-10 
C  2016-05-15  1  2016-05-12 
C  2016-05-15  2  2016-05-12 
D  2016-05-30  3  2016-05-15 
D  2016-05-30  9  2016-05-15 

Aşağıdaki doğru çözüm değildir farkettiğimde ben başım çizilmeye:

df %>% group_by(Date) %>% mutate(Date_lagged = lag(Date)) 

herhangi bir fikir nasıl düzeltilir?

cevap

6

lagn=1 ile varsayılan ofsetler. Ancak, 'Ekip' ve 'Tarih' için yinelenen öğelerimiz var. Beklenen çıktının alınabilmesi için, distinct 'Takım', 'Tarih' satırlarını almamız gerekiyor, 'Tarih' ile right_join (veya left_join) 'in orijinal veri kümesi ile lag arasında bir' Date_lagged 'oluşturun.

distinct(df, Team, Date) %>% 
     mutate(Date_Lagged = lag(Date)) %>% 
     right_join(., df) %>% 
     select(Team, Date, Points, Date_Lagged) 
# Team  Date Points Date_Lagged 
#1  A 2016-05-10  1  <NA> 
#2  A 2016-05-10  4  <NA> 
#3  A 2016-05-10  3  <NA> 
#4  A 2016-05-10  2  <NA> 
#5  B 2016-05-12  1 2016-05-10 
#6  B 2016-05-12  5 2016-05-10 
#7  B 2016-05-12  6 2016-05-10 
#8  C 2016-05-15  1 2016-05-12 
#9  C 2016-05-15  2 2016-05-12 
#10 D 2016-05-30  3 2016-05-15 
#11 D 2016-05-30  9 2016-05-15 

Ya biz de

df %>% 
    mutate(Date_Lagged = rep(lag(unique(Date)), table(Date))) 
3

Sen rle kullanarak örneğin çok temel Ar ile yapabilirsiniz yapabilirsiniz:

with(rle(as.character(df$Date)), rep(c(NA, head(values, -1)), lengths)) 
# [1] NA   NA   NA   NA   "2016-05-10" "2016-05-10" 
# [7] "2016-05-10" "2016-05-12" "2016-05-12" "2016-05-15" "2016-05-15" 
İlgili konular