2016-11-24 3 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  id n 
Charlie C2 9 
Charlie C1 3 
Alpha  A1 5 
Alpha  A2 4 
Echo  E1 7 
Echo  E2 1 

Поскольку Чарли 12, Alpha имеет 9 и Echo имеет 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 [с (dat, order (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 
Смежные вопросы