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

cwi*_*ind 8 r dplyr

如标题,如何获取跨行的第二/第三大/最小值dplyr?有没有一种优雅的方式来实现它?

\n
a <- data.frame(gp1=c(3:11), gp2=c(1:9), gp3=c(8,8,2,6,6,6,12,12,6))\n\n## the max/min value is very simple\na %>%\n    rowwise() %>%\n    mutate(max1=max(gp1, gp2, gp3))\n#\n# # A tibble: 9 \xc3\x97 4\n# # Rowwise: \n#     gp1   gp2   gp3  max1\n#   <int> <int> <dbl> <dbl>\n# 1     3     1     8     8\n# 2     4     2     8     8\n# 3     5     3     2     5\n# 4     6     4     6     6\n# 5     7     5     6     7\n# 6     8     6     6     8\n# 7     9     7    12    12\n# 8    10     8    12    12\n# 9    11     9     6    11\n
Run Code Online (Sandbox Code Playgroud)\n

结果应该与此类似:

\n
#\n# # A tibble: 9 \xc3\x97 4\n# # Rowwise: \n#     gp1   gp2   gp3  max1   max2  \n#   <int> <int> <dbl> <dbl>  <dbl>\n# 1     3     1     8     8      3\n# 2     4     2     8     8      4\n# 3     5     3     2     5      3\n# 4     6     4     6     6      6\n# 5     7     5     6     7      6\n# 6     8     6     6     8      6\n# 7     9     7    12    12      9\n# 8    10     8    12    12     12\n# 9    11     9     6    11      9\n
Run Code Online (Sandbox Code Playgroud)\n

jdo*_*res 5

您可以c_across与 一起使用sort。这里使用rev反转排序后的数据,可以很容易地选择索引为 1 的最大值,索引为 2 的第二大值,等等。

请注意,示例输出中的“max2”列在某些行中出现错误(我认为在某些情况下您可能已包含“max1”列)。

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
Run Code Online (Sandbox Code Playgroud)