2015-01-18 3 views
8

dplyr을 사용하여 창 함수를 만들려고합니다. 각 값과 해당 그룹의 첫 번째 차이점이있는 새 벡터를 반환합니다. 이 데이터 집합 주어진 예를 들어 ,이 그룹dplyr 그룹과 첫 번째 차이점

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 

그리고 주어진 :

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 
:

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

이 결과를 줄 것인가를이 데이터 세트를 생성

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) 
) 

따라서 사용자, 라이브러리 및 큐레이터의 각 그룹마다 iterationNum = 0 인 rf 값을 뺀 rf 값을 얻습니다. first 함수, rank 함수 및 다른 함수를 사용하여 재생하려했지만이를 못 채지 못했습니다.

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

그리고 :

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

:이 오류 메시지가 R 되돌아 충돌

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

--- 편집 ---

이것은 내가 뭘하려

+0

이 작업을 수행하는 데 필요한 모든 기능을 이미 알고있는 것으로 보입니다. 시도한 내용과 예상대로 작동하지 않은 내용을 보여줄 수 있습니까? 아마도 차이를 계산하기 전에 데이터를 정렬 (정렬)해야합니다. –

+1

당신은 가까웠습니다. mutate 내부에서'rf-rf [iterationNum == 0]'을 대신 사용하십시오. 다른 옵션은'arrange (iterationNum)'을 파이프의 별도 단계로 사용하고 각 그룹에 rf가 0이고 no가 있다고 확신 할 경우 mutate의'rf-first (rf)'를 사용하는 것입니다 낮은 값. –

+0

'rf-first (rf, iterationNum)' – hadley

답변

5

내가 설명한 두 가지 접근 방식 위 내용은 다음과 같습니다.

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 

또는 iterationNum하여 데이터를 주문 arrange를 사용 : 당신이 볼 수 있듯이

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 

은 모두 샘플 데이터에 대해 동일한 출력을 생성합니다.

관련 문제