2015-01-18 18 views
8

Tôi đang cố gắng tạo một chức năng cửa sổ với dplyr, sẽ trả về một vectơ mới với sự khác biệt giữa mỗi giá trị và giá trị đầu tiên của nhóm. Ví dụ, đưa ra số liệu này:khác biệt so với nhóm đầu tiên với dplyr

dummy <- data.frame(userId=rep(1,6), 
    libId=rep(999,6), 
    curatorId=c(1:2,1:2,1:2), 
    iterationNum=c(0,0,1,1,2,2), 
    rf=c(5,10,0,15,30,40) 
) 

Điều đó tạo ra tập dữ liệu này:

userId libId curatorId iterationNum rf 
1  1 999   1   0 5 
2  1 999   2   0 10 
3  1 999   1   1 0 
4  1 999   2   1 15 
5  1 999   1   2 30 
6  1 999   2   2 40 

Và cho nhóm này:

dummy<-group_by(dummy,libId,userId,curatorId) 

sẽ cho kết quả này:

userId libId curatorId iterationNum rf rf.diff 
1  1 999   1   0 5 0 
2  1 999   2   0 10 0 
3  1 999   1   1 0 -5 
4  1 999   2   1 15 -5 
5  1 999   1   2 30 25 
6  1 999   2   2 40 30 

Vì vậy, đối với mỗi nhóm người dùng, libs và curators, tôi sẽ nhận được giá trị rf, trừ đi giá trị rf với iterationNum = 0. Tôi đã thử chơi với chức năng first, chức năng rank và các chức năng khác, nhưng không thể tìm cách làm móng tay.

--- EDIT ---

Đây là những gì tôi đã cố gắng:

dummy %>% 
    group_by(userId,libId,curatorId) %>% 
    mutate(rf.diff = rf - subset(dummy,iterationNum==0)[['rf']]) 

Và:

dummy %>% 
    group_by(userId,libId,curatorId) %>% 
    mutate(rf.diff = rf - first(x = rf,order_by=iterationNum)) 

nào treo R và trả về thông báo lỗi này:

pure virtual method called terminate called after throwing an instance of 'Rcpp::exception' what(): incompatible size (%d), expecting %d (the group size) or 1`

+0

Dường như bạn đã biết tất cả các chức năng bạn cần thực hiện. Bạn có thể cho thấy những gì bạn đã thử và những gì không hoạt động như mong đợi? Có lẽ bạn chỉ cần sắp xếp (thứ tự) dữ liệu của bạn trước khi tính toán sự khác biệt. –

+1

Bạn đã thân thiết. Sử dụng 'rf - rf [iterationNum == 0]' bên trong biến thể thay thế. Tùy chọn khác là sắp xếp dữ liệu bằng cách sử dụng 'arrang (iterationNum)' như một bước riêng biệt trong đường ống và sử dụng 'rf - first (rf)' trong mutate nếu bạn chắc chắn rằng mỗi nhóm có 0 trong rf và không giá trị thấp hơn. –

+0

'rf - đầu tiên (rf, iterationNum)' – hadley

Trả lời

5

Hai cách tiếp cận tôi đã nhận xét ở trên là như sau.

dummy %>% 
    group_by(libId, userId, curatorId) %>% 
    mutate(rf.diff = rf - rf[iterationNum == 0]) 
#Source: local data frame [6 x 6] 
#Groups: libId, userId, curatorId 
# 
# userId libId curatorId iterationNum rf rf.diff 
#1  1 999   1   0 5  0 
#2  1 999   2   0 10  0 
#3  1 999   1   1 0  -5 
#4  1 999   2   1 15  5 
#5  1 999   1   2 30  25 
#6  1 999   2   2 40  30 

Hoặc sử dụng arrange để đặt hàng các dữ liệu bằng cách iterationNum:

dummy %>% 
    arrange(iterationNum) %>% 
    group_by(libId, userId, curatorId) %>% 
    mutate(rf.diff = rf - first(rf)) 
#Source: local data frame [6 x 6] 
#Groups: libId, userId, curatorId 
# 
# userId libId curatorId iterationNum rf rf.diff 
#1  1 999   1   0 5  0 
#2  1 999   2   0 10  0 
#3  1 999   1   1 0  -5 
#4  1 999   2   1 15  5 
#5  1 999   1   2 30  25 
#6  1 999   2   2 40  30 

Như bạn có thể thấy, cả sản xuất đầu ra tương tự cho các dữ liệu mẫu.

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