2016-06-23 25 views
5

Tôi đang gặp sự cố khi cố gắng tụt lại ngày được nhóm theo nhóm.Lag/nhóm theo nhóm trong R và dplyr

dữ liệu:

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 

Kết quả mong đợi:

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 

Tôi gãi đầu của tôi sau khi tôi nhận ra đây không phải là giải pháp đúng:

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

Bất kỳ ý tưởng làm thế nào để sửa chữa nó?

Trả lời

6

lag theo số bù mặc định với n=1. Tuy nhiên, chúng tôi có các yếu tố trùng lặp cho 'Nhóm' và 'Ngày'. Theo thứ tự để có được kết quả mong đợi, chúng tôi cần có các hàng distinct của 'Nhóm', 'Ngày', tạo 'Ngày_lagged' với lag của 'Ngày' và right_join (hoặc left_join) với tập dữ liệu gốc.

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 

Hoặc chúng ta cũng có thể làm

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

Bạn có thể làm điều này với cơ sở R quá, ví dụ sử dụng rle:

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" 
Các vấn đề liên quan