dplyr

2015-01-18 26 views
8

के साथ समूह में पहले से अंतर मैं dplyr के साथ एक विंडो फ़ंक्शन बनाने की कोशिश कर रहा हूं, जो प्रत्येक मान और उसके समूह के बीच के अंतर के साथ एक नया वेक्टर वापस कर देगा। उदाहरण के लिए, इस डेटासेट दिया: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) 
) 

इस डेटासेट बनाता है यही कारण है कि:

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) 

इस परिणाम दे सकते हैं

तो उपयोगकर्ताओं के प्रत्येक समूह, libs और curators के लिए, मुझे आरएफ मान मिलेगा, आरएफ मान को iterationNum = 0 के साथ घटाएं। मैंने first फ़ंक्शन, rank फ़ंक्शन और अन्य के साथ खेलने का प्रयास किया, लेकिन इसे नाखून करने का कोई तरीका नहीं मिला।

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

और::

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

कौन सा आर और रिटर्न दुर्घटनाओं यह त्रुटि संदेश:

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

ऐसा लगता है कि आप पहले से ही उन सभी कार्यों को जानते हैं जिन्हें आपको करने की आवश्यकता है। क्या आप दिखा सकते हैं कि आपने क्या प्रयास किया और अपेक्षित के रूप में क्या काम नहीं किया? शायद आपको मतभेदों की गणना करने से पहले अपने डेटा को व्यवस्थित करने (ऑर्डर) करने की आवश्यकता है। –

+1

आप करीब थे। बदले में mutate के अंदर 'आरएफ - आरएफ [iterationNum == 0] 'का प्रयोग करें। दूसरा विकल्प पाइप में एक अलग चरण के रूप में 'व्यवस्था (iterationNum)' का उपयोग करके डेटा को व्यवस्थित करना है और यदि आप सुनिश्चित हैं कि प्रत्येक समूह में 0 0 आरएफ और नहीं है तो म्यूटेट में 'आरएफ - फर्स्ट (आरएफ)' का उपयोग करें। कम मूल्य –

+0

'आरएफ - पहला (आरएफ, इटेशन नम)' – 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 

आप देख सकते हैं, दोनों नमूना डेटा के लिए एक ही उत्पादन का उत्पादन।