如何在dplyr中按行统计最大值在指定列的重复次数?
问题描述
现有如下表格:
| col1 | col2 | col3 | col4 |
|---|---|---|---|
| 1 | 2 | 1 | 4 |
| 5 | 6 | 6 | 3 |
需要完成两个任务:
- 计算每行的最大值
- 统计该最大值在当前行的重复次数
期望得到的结果表如下:
| col1 | col2 | col3 | col4 | max_val | repetition |
|---|---|---|---|---|---|
| 1 | 2 | 1 | 4 | 4 | 1 |
| 5 | 6 | 6 | 3 | 6 | 2 |
目前已通过以下代码实现每行最大值的计算:
df %>% rowwise() %>% mutate(max_val = max(col1:col4))
但在统计最大值重复次数时遇到阻碍,思路是通过sum(当前行指定列 == max_val)实现,但不清楚在dplyr中如何选择当前行的指定列进行判断。
解决方法
可以在mutate中结合c_across()函数实现需求,c_across()是dplyr中专门用于rowwise()上下文里提取当前行指定列值的函数,能将列值转换为向量供后续判断。
完整代码如下:
library(dplyr) df %>% rowwise() %>% mutate( max_val = max(col1:col4), repetition = sum(c_across(col1:col4) == max_val) ) %>% ungroup() # 完成逐行操作后取消分组,避免影响后续处理
代码说明
c_across(col1:col4):在逐行处理的上下文中,提取当前行col1到col4的所有值组成向量sum(c_across(...) == max_val):将向量中的每个元素与当前行的最大值比较,得到逻辑向量后求和,结果即为最大值的重复次数ungroup():取消行分组状态,因为rowwise()会改变数据框的分组属性,后续操作若无需逐行处理,建议执行此步骤
内容的提问来源于stack exchange,提问作者GitZine
相关产品推荐
相关产品推荐

