我在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列仍然按字母顺序排序。
这有一个优雅的解决方案吗?
答案 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