首先按组和,然后按频率对数据帧进行排序

时间:2016-11-24 22:54:56

标签: r

我在data.frame中有以下数据:

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

我试图先用reg sum对它进行排序,然后用n进行排序(两者都减少)。 结果将是:

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列仍然按字母顺序排序。

这有一个优雅的解决方案吗?

4 个答案:

答案 0 :(得分: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 :(得分: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 :(得分: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

答案 3 :(得分: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