如何根据 R 中的每个第二个值按降序对数据进行排序?

How to sort data in descending order based on every second value in R?

我在 R 中使用 dplyr 处理大部分数据。然而,我很难实现这种特殊效果。似乎也无法通过谷歌搜索找到答案。

假设我有这样的数据,我想要实现的是根据 2021 年的现金价值对按人分组的数据进行排序。下面我展示了我希望实现的结果。我想我只是想念我对这个的想象。如果我只有 2021 年的价值,我可以简单地使用 ... %>% arrange(desc(cash)),但我不确定如何从这里开始。

    year   person        cash
0   2020   personone     29
1   2021   personone     40
2   2020   persontwo     17
3   2021   persontwo     13
4   2020   personthree   62
5   2021   personthree   55      

我想要实现的是根据 2021 年的值按降序对这些数据进行排序。这样数据应该如下所示:

    year   person        cash
0   2020   personthree   62
1   2021   personthree   55
2   2020   personone     29
3   2021   personone     40
4   2020   persontwo     17
5   2021   persontwo     13   

一种使用连接的方法:

df %>%
  filter(year == 2021) %>%
  # group_by(person) %>% slice(2) %>% ungroup() %>%  #each person's yr2
  arrange(-cash) %>%
  select(-cash, -year) %>%
  left_join(df)

输出:

       person year cash
1 personthree 2020   62
2 personthree 2021   55
3   personone 2020   29
4   personone 2021   40
5   persontwo 2020   17
6   persontwo 2021   13

另一个选项:

library(dplyr)
dat %>%
  group_by(person) %>%
  mutate(maxcash = max(cash)) %>%
  arrange(desc(maxcash)) %>%
  ungroup()
# # A tibble: 6 x 4
#    year person       cash maxcash
#   <int> <chr>       <int>   <int>
# 1  2020 personthree    62      62
# 2  2021 personthree    55      62
# 3  2020 personone      29      40
# 4  2021 personone      40      40
# 5  2020 persontwo      17      17
# 6  2021 persontwo      13      17

或者单线,使用基础 R 作为助手:

dat %>%
  arrange(-ave(cash, person, FUN = max))
#   year      person cash
# 4 2020 personthree   62
# 5 2021 personthree   55
# 0 2020   personone   29
# 1 2021   personone   40
# 2 2020   persontwo   17
# 3 2021   persontwo   13

编辑:

如果您的意思不是 max,而是“始终是 2021 年的数据”,那么:

dat %>%
  group_by(person) %>%
  mutate(cash2021 = cash[year == 2021]) %>%
  arrange(desc(cash2021)) %>%
  ungroup()
# # A tibble: 6 x 4
#    year person       cash cash2021
#   <int> <chr>       <int>    <int>
# 1  2020 personthree    62       55
# 2  2021 personthree    55       55
# 3  2020 personone      29       40
# 4  2021 personone      40       40
# 5  2020 persontwo      17       13
# 6  2021 persontwo      13       13