2016-10-21 87 views
1

This question描述了我的問題的設置非常好。按列分組數據幀,在組內添加索引

然而,取代第二個值,我有一個因子叫做algorithm。我的數據幀如下所示(請注意,即使在他們的小組值的多重可能性):

algorithm <- c("global", "distributed", "distributed", "none", "global", "global", "distributed", "none", "none") 
v <- c(5, 2, 6, 7, 3, 1, 10, 2, 2) 
df <- data.frame(algorithm, v) 
df 
    algorithm v 
1  global 5 
2 distributed 2 
3 distributed 6 
4  none 7 
5  global 3 
6  global 1 
7 distributed 10 
8  none 2 
9  none 2 

我想通過v的數據幀進行排序,但得到的每個條目排序位置相對於它的組(算法)。這個位置應該被添加到原始數據框(所以我不需要重新排列它),因爲我想繪製計算出的位置爲x,值爲y,使用ggplot(按算法分組,例如,每個算法是一組點)。

所以結果應該是這樣的:

algorithm v groupIndex 
1  global 5 3 
2 distributed 2 1 
3 distributed 6 2 
4  none 7 3 
5  global 3 2 
6  global 1 1 
7 distributed 10 3 
8  none 2 1 
9  none 2 2 

到目前爲止,我知道我可以通過值或其他方式輪,然後再命令由算法的數據。我想在第二步中,我將不得不計算每個組內的索引?有沒有簡單的方法來做到這一點?

df[order(df$algorithm, df$v), ] 
    algorithm v 
2 distributed 2 
3 distributed 6 
7 distributed 10 
6  global 1 
5  global 3 
1  global 5 
8  none 2 
9  none 2 
4  none 7 

編輯:它不能保證,有每個組條目相同數量的!

回答

3

order各組中的雙應用程序應該覆蓋它:

ave(df$v, df$algorithm, FUN=function(x) order(order(x))) 
#[1] 3 1 2 3 2 1 3 1 2 

這也等同於:

ave(df$v, df$algorithm, FUN=function(x) rank(x,ties.method="first")) 
#[1] 3 1 2 3 2 1 3 1 2 

,這反過來又意味着你可以採取的frank優勢從data.table如果您關心速度:

setDT(df)[, grpidx := frank(v,ties.method="first"), by=algorithm] 
df 
#  algorithm v grpidx 
#1:  global 5  3 
#2: distributed 2  1 
#3: distributed 6  2 
#4:  none 7  3 
#5:  global 3  2 
#6:  global 1  1 
#7: distributed 10  3 
#8:  none 2  1 
#9:  none 2  2 
2

其中一種方法如下。我認爲您可以使用with_order()爲每個組訂購v值。您可以在功能中使用row_number()分配等級。通過這種方式,您可以跳過一個步驟來爲每個組排列數據,正如您使用order()所嘗試的那樣。

library(dplyr) 
group_by(df, algorithm) %>% 
mutate(groupInd = with_order(order_by = v, fun = row_number, x = v)) 

# algorithm  v groupInd 
#  <fctr> <int> <int> 
#1  global  5  3 
#2 distributed  2  1 
#3 distributed  6  2 
#4  none  7  3 
#5  global  3  2 
#6  global  1  1 
#7 distributed 10  3 
#8  none  2  1 
#9  none  2  2