首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过dplyr获得跨行的所选最大值/最小值(即第二大/最小值)

如何通过dplyr获得跨行的所选最大值/最小值(即第二大/最小值)
EN

Stack Overflow用户
提问于 2022-10-19 11:29:30
回答 4查看 180关注 0票数 7

作为标题,如何通过dplyr获得行间的第二/第三大/最小值?是否有一种优雅的方法来实现它?

代码语言:javascript
复制
a <- data.frame(gp1=c(3:11), gp2=c(1:9), gp3=c(8,8,2,6,6,6,12,12,6))

## the max/min value is very simple
a %>%
    rowwise() %>%
    mutate(max1=max(gp1, gp2, gp3))
#
# # A tibble: 9 × 4
# # Rowwise: 
#     gp1   gp2   gp3  max1
#   <int> <int> <dbl> <dbl>
# 1     3     1     8     8
# 2     4     2     8     8
# 3     5     3     2     5
# 4     6     4     6     6
# 5     7     5     6     7
# 6     8     6     6     8
# 7     9     7    12    12
# 8    10     8    12    12
# 9    11     9     6    11

其结果应与此类似:

代码语言:javascript
复制
#
# # A tibble: 9 × 4
# # Rowwise: 
#     gp1   gp2   gp3  max1   max2  
#   <int> <int> <dbl> <dbl>  <dbl>
# 1     3     1     8     8      3
# 2     4     2     8     8      4
# 3     5     3     2     5      3
# 4     6     4     6     6      6
# 5     7     5     6     7      6
# 6     8     6     6     8      6
# 7     9     7    12    12      9
# 8    10     8    12    12     12
# 9    11     9     6    11      9
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-10-19 11:34:29

您可以使用c_acrosssort。这里使用的rev反转了排序的数据,使得选择索引1的最大值、索引2的第二大值变得很容易,等等。

注意,示例输出中的列"max2“在某些行中会出错(我认为在某些情况下您可能包括了"max1”列)。

代码语言:javascript
复制
a %>% 
  rowwise() %>% 
  mutate(
    max1 = max(gp1, gp2, gp3),
    max2 = rev(sort(c_across(c(gp1, gp2, gp3))))[2]
  )

    gp1   gp2   gp3  max1  max2
  <int> <int> <dbl> <dbl> <dbl>
1     3     1     8     8     3
2     4     2     8     8     4
3     5     3     2     5     3
4     6     4     6     6     6
5     7     5     6     7     6
6     8     6     6     8     6
7     9     7    12    12     9
8    10     8    12    12    10
9    11     9     6    11     9
票数 4
EN

Stack Overflow用户

发布于 2022-10-19 12:31:34

一种不涉及pmaprowwise解决方案

代码语言:javascript
复制
library(purrr)
a %>% 
  mutate(max1 = pmax(gp1, gp2, gp3),
         max2 = pmap(., ~ rev(sort(c(..1, ..2, ..3)))[2]))

  gp1 gp2 gp3 max1 max2
1   3   1   8    8    3
2   4   2   8    8    4
3   5   3   2    5    3
4   6   4   6    6    6
5   7   5   6    7    6
6   8   6   6    8    6
7   9   7  12   12    9
8  10   8  12   12   10
9  11   9   6   11    9
票数 4
EN

Stack Overflow用户

发布于 2022-10-19 11:46:34

我相信有一种更短的方法可以实现自动化,但是现在有一个快速的解决方案:

代码语言:javascript
复制
library(dplyr)
library(slider)

a %>%
  rowwise() %>%
  mutate(output = list(slide_dfc(sort(c_across(everything()), decreasing = TRUE), max, .before = 1, .complete = TRUE))) %>%
  unnest_wider(output) %>%
  rename_with(~ sub('\\.+(\\d)', 'Max_\\1', .), contains('.')) %>%
  suppressMessages()

# A tibble: 9 × 5
    gp1   gp2   gp3 Max_1 Max_2
  <int> <int> <dbl> <dbl> <dbl>
1     3     1     8     8     3
2     4     2     8     8     4
3     5     3     2     5     3
4     6     4     6     6     6
5     7     5     6     7     6
6     8     6     6     8     6
7     9     7    12    12     9
8    10     8    12    12    10
9    11     9     6    11     9
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74124565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档