R语言使用dplyr按id、rank双分组取每组code最小值的实现方法
解决方法
你现有代码的问题有两点:
- 仅设置了
id作为分组维度,未添加rank作为分组字段 filter()的筛选条件错误,你需要匹配的是分组内code的最小值,而非id的最小值
正确实现代码如下:
library(dplyr) DF <- data.frame(id=c(1,1,1,1,2),rank=c("1","1","2","3","1"),code=c("0","1","1","0","0")) DF %>% group_by(id, rank) %>% # 同时按id、rank两个字段分组 filter(code == min(code)) %>% ungroup() # 不需要保留分组结构时可添加该行,方便后续数据处理
运行后输出结果和你预期一致:
id rank code 1 1 1 0 2 1 2 1 3 1 3 0 4 2 1 0
如果存在同一分组下多个code并列最小值的场景,你也可以用slice_min()控制返回行数:
DF %>% group_by(id, rank) %>% # with_ties = FALSE 表示并列时仅返回第一行,需要返回所有并列行改为TRUE即可 slice_min(code, n = 1, with_ties = FALSE) %>% ungroup()
内容的提问来源于stack exchange,提问作者hklovs
相关产品推荐
相关产品推荐

