使用dplyr按组依据优先级列表生成统一汇总列的问题
问题描述
现有如下格式的表格:
ID, value 1, NA 1, Positive 1, Negative 1, NA 2, NA 2, Absent 2, Negative 2, NA ...
需求:按ID分组,新增summary_value列,取值为每组内优先级最高的值,优先级定义为:Positive>Negative>Absent>Not Done>NA。
此前使用的dplyr代码:
df <- df %>% group_by(ID) %>% mutate(summary_value = value) %>% fill(summary_value, .direction="updown") %>% ungroup()
得到的结果中每组summary_value存在多个值,不符合预期。期望结果如下:
ID, value, summary_value 1, NA, Positive 1, Positive, Positive 1, Negative, Positive 1, NA, Positive 2, NA, Negative 2, Absent, Negative 2, Negative, Negative 2, NA, Negative ...
当前使用dplyr v1.1.1和tidyr v1.3.0,寻求符合需求的dplyr代码。
解决方案
核心思路是先将value列转换为带有自定义优先级的因子类型,利用因子的排序特性获取每组最高优先级值,再将该值映射到组内所有行。
具体代码如下:
# 定义优先级顺序(从高到低) priority_order <- c("Positive", "Negative", "Absent", "Not Done", NA) df <- df %>% group_by(ID) %>% # 将value转为自定义顺序的因子,保留NA作为最低优先级 mutate( value_factor = factor(value, levels = priority_order, exclude = NULL), # 取组内因子的最大值,转回原字符格式 summary_value = as.character(max(value_factor, na.rm = TRUE)) ) %>% # 移除临时计算用的因子列(可选操作) select(-value_factor) %>% ungroup()
代码说明
- 优先级定义:按需求从高到低列出所有可能值,NA放在末尾作为最低优先级。
- 因子转换:通过
factor()指定自定义排序规则,exclude = NULL确保NA被纳入因子的水平体系中。 - 提取最高值:因子的大小由
levels顺序决定,max()会直接返回组内优先级最高的因子,再转回字符类型得到最终结果。 - 临时列清理:可选移除
value_factor临时列,让结果更简洁。
这样处理后,每组所有行的summary_value都会是该组内优先级最高的值,完全符合预期。
内容的提问来源于stack exchange,提问作者user36196
相关产品推荐
相关产品推荐

