2012-12-17 76 views
6

我有一個df與類型和值。我想按照x的順序將它們排列在type之內,並給出一個有多少其他行行n具有比(列pos)更高的值x的計數。計算每組的排名

例如

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

只讀'min'它使關係在序列中具有最小值,它們在向量中找到。否則我的關係值都會是1 – user1320502