2017-09-01 66 views
1

我正在嘗試基於與列ID關聯的中值重新排序數據幀。如何基於列組的平均值重新排序數據幀

我有一個ID列和2列值的數據框。

ID <- c("a","a","a","b","b","b","c","c","c","c") 
alpha <- c(3,4,5,9,11,13,1,1,1,0) 
beta <- c(2,3,4,3,4,5,4,5,6,7) 
df <- data.frame(ID,alpha,beta) 

    ID alpha beta 
1 a  3 2 
2 a  4 3 
3 a  5 4 
4 b  9 3 
5 b 11 4 
6 b 13 5 
7 c  1 4 
8 c  1 5 
9 c  1 6 
10 c  0 7 

我想以使得該柱ID是基於所述相關聯的值的在α列中的decending裝置的順序進行重新排序該數據幀:

ID alpha beta 
1 b  9 3 
2 b 11 4 
3 b 13 5 
4 a  3 2 
5 a  4 3 
6 a  5 4 
7 c  1 4 
8 c  1 5 
9 c  1 6 
10 c  0 7 

這是不成功的:

df[reorder(df$ID, df$alpha, FUN = mean),] 
+0

你很接近,但兩個概念混淆。 'reorder'重新排序因子的級別,如果您希望排序只保留在數據框的行順序之外,這很有用。我會做'df $ ID = reorder(df $ ID,df $ alpha,FUN = mean)''。然後你可以通過該列來訂購數據框:'df [order(df $ ID),]' – Gregor

+0

@coffeinjunky好點,但我還沒有足夠的積分來支持;) – 1TonDan

回答

0

嘗試

library(dplyr) 
df %>% group_by(ID) %>% mutate(m = mean(alpha)) %>% arrange(desc(m)) %>% select(-m) 
# A tibble: 10 x 3 
# Groups: ID [3] 
     ID alpha beta 
    <fctr> <dbl> <dbl> 
1  b  9  3 
2  b 11  4 
3  b 13  5 
4  a  3  2 
5  a  4  3 
6  a  5  4 
7  c  1  4 
8  c  1  5 
9  c  1  6 
10  c  0  7 
0

下面是使用data.table

library(data.table) 
setDT(df)[df[, mean(alpha), ID][order(-V1), .(ID)], on = .(ID)] 
# ID alpha beta 
#1: b  9 3 
#2: b 11 4 
#3: b 13 5 
#4: a  3 2 
#5: a  4 3 
#6: a  5 4 
#7: c  1 4 
#8: c  1 5 
#9: c  1 6 
#10: c  0 7 

的選項,或者我們可以使用avebase R得到mean然後order

df[with(df, order(-ave(alpha, ID))),]