2017-11-12 24 views
5

Tôi có sau data.table, dtgrouped2:Có điều kiện tham gia vào data.table?

 MonthNo Unique Total 
1:  1 AAA 10 
2:  1 BBB  0 
3:  2 CCC  3 
4:  2 DDD  0 
5:  3 AAA  0 
6:  3 BBB 35 
7:  4 CCC 15 
8:  4 AAA  0 
9:  5 BBB 60 
10:  5 CCC  0 
11:  6 DDD 100 
12:  6 AAA  0 

Và một bảng, dt2:

 Unique1 StartDate EndDate Amount1 Amount2 
1:  AAA  0  1  7  0 
3:  AAA  1  2  5  0 
2:  AAA  2  4  3  2 

Tôi muốn chèn Amount1 và AMOUNT2 từ dt2 để dtgrouped2 dựa trên logic sau trên " Duy nhất "được đánh giá cho mỗi hàng của dtgrouped2:

filter(StartDate< MonthNo & EndDate>=MonthNo) 
then MAX(EndDate) 
then insert Amount1 as Amount1 and Amount2 as Amount2 

Vì vậy, bạn có thể thấy rằng kết quả là khác nhau tùy thuộc vào hàng. Đây sẽ là đầu ra mong đợi:

Date MonthNo Unique Items Amounts Amount1 Amount2 
Jan  1  AAA x   10  7 0 
Jan  1  BBB y   2  NA NA 
Feb  2  CCC x   3  NA NA 
Feb  2  DDD y   15  NA NA 
March  3  AAA y   20  3 2 
March  3  BBB x   35  NA NA 
April  4  CCC x   15  NA NA 
April  4  AAA y   50  3 2 
May  5  BBB x   60  NA NA 
May  5  CCC y   70  NA NA 
June  6  DDD x   100  NA NA 
June  6  AAA y   20  NA NA 
+5

Tôi không hiểu đầu ra mong muốn của bạn. 1- Trường hợp cột 'Amounts' đến từ đâu? Nó cư trú như thế nào? (Nó không bằng với cột 'Tổng số'). 2- Trong hàng thứ 5, bạn có giá trị sai (?) Trong 'Amount1' và' Amount2', nó phải là '5' và' 0' tương ứng. 3 - Tại sao ở hàng cuối cùng, các giá trị 'Amount1' và' Amount2' không được điền? Nó phải là '3' và' 2' tương ứng, phải không? Dù sao, tôi nghĩ rằng bạn có thể sử dụng này: 'dt2 [dtgrouped2,. (Amount1, Amount2), on =. (Unique1 = duy nhất, StartDate

+0

Xin lỗi, vâng, bạn hoàn toàn chính xác, logic nên có được Ngày kết thúc> = MonthNo. Bảng kết quả là không được nhóm lại, đó là lý do cho các cột bổ sung. Cảm ơn bạn, tôi sẽ cố gắng này! – Topographical

+0

Cảm ơn bạn David, điều này đã làm việc! Cảm ơn một tấn. – Topographical

Trả lời

5

tôi đề nghị sử dụng phi đẳng tham gia kết hợp với mult = "last" (theo thứ tự để nắm bắt chỉ gần đây nhất EndDate)

dtgrouped2[, c("Amount1", "Amount2") := # Assign the below result to new columns in dtgrouped2 
       dt2[dtgrouped2, # join 
        .(Amount1, Amount2), # get the column you need 
        on = .(Unique1 = Unique, # join conditions 
         StartDate < MonthNo, 
         EndDate >= MonthNo), 
        mult = "last"]] # get always the latest EndDate 
dtgrouped2 

#  MonthNo Unique Total Amount1 Amount2 
# 1:  1 AAA 10  7  0 
# 2:  1 BBB  0  NA  NA 
# 3:  2 CCC  3  NA  NA 
# 4:  2 DDD  0  NA  NA 
# 5:  3 AAA  0  3  2 
# 6:  3 BBB 35  NA  NA 
# 7:  4 CCC 15  NA  NA 
# 8:  4 AAA  0  3  2 
# 9:  5 BBB 60  NA  NA 
# 10:  5 CCC  0  NA  NA 
# 11:  6 DDD 100  NA  NA 
# 12:  6 AAA  0  NA  NA 

Lý do mà bạn sẽ cần phải tham gia dt2[dtgrouped] trước tiên (và không phải theo cách khác) là vì bạn muốn tham gia dt2 cho mỗi giá trị có thể trong dtgrouped, do đó cho phép nhiều giá trị trong dt2 để được tham gia dtgrouped

+0

Cảm ơn một lần nữa, và cho lời giải thích tuyệt vời David, điều này đã làm việc! – Topographical

Các vấn đề liên quan