在按其他列分组之前先按列排列

Arrange by Column Before Grouping by Other Columns

我正在尝试按一列排列数据框,然后按另外两列将其分组。

示例代码和我的尝试如下:

df <- data.frame(person = c("p1", "p2", "p4", "p3","p2", "p3", "p1", "p4"),
                 data1 = c("a","a","b","b","b","a","b","a"),
                 data2 = c(8,7,6,5,4,3,2,1))


df1 <- df %>%
  group_by(person, data1) %>%
  arrange(desc(data2),  person, data1)


person data1 data2
  <chr>  <chr> <dbl>
1 p1     a         8
2 p2     a         7
3 p4     b         6
4 p3     b         5
5 p2     b         4
6 p3     a         3
7 p1     b         2
8 p4     a         1

它应该从 data2 下降(从最高到最低),但按 persondata 分组,以便相应的 person 行位于更高的行。

期望的结果如下所示:

    person data1 data2
1     p1     a     8
2     p1     b     2
3     p2     a     7
4     p2     b     4
5     p4     b     6
6     p4     a     1
7     p3     b     5
8     p3     a     3

你可以按人取max data2,然后按max排列

df %>% 
  group_by(person) %>%
  mutate(m=max(data2)) %>% 
  arrange(desc(m), person, desc(data2)) %>%
  select(-m)

输出:

  person data1 data2
1     p1     a     8
2     p1     b     2
3     p2     a     7
4     p2     b     4
5     p4     b     6
6     p4     a     1
7     p3     b     5
8     p3     a     3

相当于:

df%>% 
  inner_join(
    df %>% group_by(person) %>%
      summarize(m=max(data2)),
    by="person"
  ) %>%
  arrange(desc(m), person, desc(data2)) %>% 
  select(-m)