2016-11-24 60 views
1

我已經在data.frame以下數據:排序組總和的數據幀的第一,然後通過頻率

reg  id n 
Echo  E1 7 
Charlie C1 3 
Alpha  A1 5 
Echo  E2 1 
Alpha  A2 4 
Charlie C2 9 

我試圖通過REG總和第一對它進行排序,然後用n(均減小)。 其結果將是:

reg  id n 
Charlie C2 9 
Charlie C1 3 
Alpha  A1 5 
Alpha  A2 4 
Echo  E1 7 
Echo  E2 1 

因爲查理有12個,阿爾法有9個和回聲有8

到目前爲止,我只能夠組和做排序的第二部分(通過糟糕的使用dplyr)。 reg列仍然按字母順序排序。

有沒有一個優雅的解決方案呢?

回答

0

使用dplyr

# data 
df1 <- read.table(text = "reg  id n 
Echo  E1 7 
Charlie C1 3 
Alpha  A1 5 
Echo  E2 1 
Alpha  A2 4 
Charlie C2 9", header = TRUE) 

library(dplyr) 
df1 %>% 
    group_by(reg) %>% 
    mutate(nSum = sum(n)) %>% 
    arrange(-nSum, -n) %>% 
    select(-nSum) 

# Source: local data frame [6 x 3] 
# Groups: reg [3] 
# 
#  reg  id  n 
# <fctr> <fctr> <int> 
# 1 Charlie  C2  9 
# 2 Charlie  C1  3 
# 3 Alpha  A1  5 
# 4 Alpha  A2  4 
# 5 Echo  E1  7 
# 6 Echo  E2  1 
2

考慮計算與ave()組總和然後兩個列進行排序,篩選出總和列:

df <- df[with(transform(df, sum=ave(df$n, df$reg, FUN=sum)), order(-sum, -n)), c(1:3)] 
row.names(df) <- seq_len(nrow(df)) 

df 

#  reg id n 
# 1 Charlie C2 9 
# 2 Charlie C1 3 
# 3 Alpha A1 5 
# 4 Alpha A2 4 
# 5 Echo E1 7 
# 6 Echo E2 1 
+1

我喜歡這個主意 - 你可以壓碎它,我想用'逸[用(DAT,爲了(AVE(N,REG,FUN = SUM),N,減少= TRUE)),]'甚至'dat [with(dat,order(-ave(n,reg,FUN = sum),-n)),]' – thelatemail

0

我們可以使用data.table

library(data.table) 
setDT(df1)[, n1:= sum(n) , by = reg][order(-n1, -n)][, n1:= NULL][] 
#  reg id n 
#1: Charlie C2 9 
#2: Charlie C1 3 
#3: Alpha A1 5 
#4: Alpha A2 4 
#5: Echo E1 7 
#6: Echo E2 1 
0

這將也工作:

df[with(df, order(-ave(df$n, df$reg, FUN=sum), -n)),] 
     reg id n 
6 Charlie C2 9 
2 Charlie C1 3 
3 Alpha A1 5 
5 Alpha A2 4 
1 Echo E1 7 
4 Echo E2 1 
相關問題