如标题,如何获取跨行的第二/第三大/最小值dplyr?有没有一种优雅的方式来实现它?
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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n
您可以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)
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |