2015-01-20 21 views
5

Hãy nói rằng tôi có data.frame này (với 3 biến)hoạt động khác trong một nhóm, sau một dplyr :: group_by()

ID Period Score 
123 2013 146 
123 2014 133 
23 2013 150 
456 2013 205 
456 2014 219 
456 2015 140 
78 2012 192 
78 2013 199 
78 2014 133 
78 2015 170 

Sử dụng dplyr Tôi có thể nhóm chúng bằng ID và lọc các ID đó xuất hiện nhiều hơn một lần

data <- data %>% group_by(ID) %>% filter(n() > 1) 

Bây giờ, những gì tôi muốn đạt được là thêm một cột đó là: Difference = Điểm của kỳ P - Hệ số của thời kỳ P-1 để có được một cái gì đó như thế này:

ID Period Score Difference 
123 2013 146 
123 2014 133 -13 
456 2013 205 
456 2014 219 14 
456 2015 140 -79 
78 2012 192 
78 2013 199 7 
78 2014 133 -66 
78 2015 170 37 

Điều này khá tầm thường để thực hiện việc này trong bảng tính, nhưng tôi không biết làm cách nào để đạt được điều này trong R.
Cảm ơn bạn đã được trợ giúp hoặc hướng dẫn.

Trả lời

15

Đây là giải pháp khác sử dụng lag. Tùy thuộc vào trường hợp sử dụng, nó có thể thuận tiện hơn diff vì số NAs rõ ràng cho thấy giá trị cụ thể không có tiền nhiệm trong khi 0 sử dụng diff có thể là kết quả của a) người tiền nhiệm còn thiếu hoặc b) trừ giữa hai giai đoạn.

data %>% group_by(ID) %>% filter(n() > 1) %>% 
    mutate(
    Difference = Score - lag(Score) 
    ) 

# ID Period Score Difference 
# 1 123 2013 146   NA 
# 2 123 2014 133  -13 
# 3 456 2013 205   NA 
# 4 456 2014 219   14 
# 5 456 2015 140  -79 
# 6 78 2012 192   NA 
# 7 78 2013 199   7 
# 8 78 2014 133  -66 
# 9 78 2015 170   37 
+0

Cảm ơn Alex. Tôi thực sự thích điều này. Vì vậy, có, tôi đồng ý tốt hơn là nên có NA cho giai đoạn đầu tiên và 0 chỉ khi sự khác biệt là 0. – Franky

+1

Bạn cũng có thể chỉ định mặc định bên trong 'lag', ví dụ: 'Điểm - độ trễ (Điểm, mặc định = 99)' và độ trễ bạn muốn sử dụng. –

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