2012-12-17 14 views
6

के लिए रैंक की गणना करें मेरे पास df प्रकार और मूल्यों के साथ है। मैं के type के भीतर उन्हें रैंक करना चाहता हूं और n की तुलना में कितनी अन्य पंक्तियों की संख्या x (कॉलम pos) से अधिक है।प्रत्येक समूह

उदा

df <- data.frame(type = c("a","a","a","b","b","b"),x=c(1,77,1,34,1,8)) 
# for type a row 3 has a higher x than row 1 and 2 so has a pos value of 2 

मैं के साथ ऐसा कर सकते हैं:

library(plyr) 
df <- data.frame(type = c("a","a","a","b","b","b"),x=c(1,77,1,34,1,8)) 
df <- ddply(df,.(type), function(x) x[with(x, order(x)) ,]) 
df <- ddply(df,.(type), transform, pos = (seq_along(x)-1)) 

    type x pos 
1 a 1 0 
2 a 1 1 
3 a 77 2 
4 b 1 0 
5 b 8 1 
6 b 34 2 

लेकिन इस दृष्टिकोण प्रकार a पंक्ति 1 और 2 के बीच खाते संबंधों पर ध्यान नहीं देता क्या उत्पादन जहां संबंधों में एक ही राशि प्राप्त करने के लिए सबसे आसान तरीका मूल्य उदा

 type x pos 
1 a 1 0 
2 a 1 0 
3 a 77 2 
4 b 1 0 
5 b 8 1 
6 b 34 2 

उत्तर

8
ddply(df,.(type), transform, pos = rank(x,ties.method ="min")-1) 

    type x pos 
1 a 1 0 
2 a 77 2 
3 a 1 0 
4 b 34 2 
5 b 1 0 
6 b 8 1 
+0

+1 कोई आवश्यक आदेश! टूल रैट में 'रैंक' जोड़ा गया! – user1320502

+0

+1! लेकिन 'मिनट' टाई विधि क्यों? – agstudy

+0

बस 'मिनट' पढ़ें, यह संबंधों को वेक्टर में पाए जाने वाले सीक्यून्स में न्यूनतम मान बनाता है। अन्यथा मेरे संबंधों में दोनों का मूल्य 1 – user1320502

संबंधित मुद्दे