如何筛选包含全局最小值的完整分组?R语言dplyr操作疑问
问题分析与解决办法
咱们先搞清楚你原来的代码为啥返回空数据框哈~
原代码的问题所在
你写的filter(all(x==min(x)))这个条件,意思是要求当前分组里的每一个x值都等于该分组自己的最小值。但看你的数据:
- 分组1的最小值是233,另外两个值是250、240,显然不是所有值都等于233;
- 分组2的最小值是10,另外两个值是250、100,同样不满足;
- 分组3的最小值是1,另外两个值是250、100,也不符合“所有x等于分组最小值”的要求。
所以这个条件在任何分组里都不成立,自然就返回空数据框啦。
正确的实现思路
你的需求是:找到包含整个数据框中x的全局最小值的分组,然后保留该分组的所有行。那我们需要调整逻辑:
- 先算出x的全局最小值;
- 分组后,判断当前分组里是否存在等于这个全局最小值的元素,只要存在,就保留整个分组的所有行。
正确代码示例
library(dplyr) # 你的原始数据 df <- data.frame( x=c(250,240,233,250,100,10,250,100,1), gr=gl(3,3) ) # 方法一:直接在filter里计算全局最小值 df %>% group_by(gr) %>% filter(any(x == min(df$x))) %>% ungroup() # 可选,取消分组状态,方便后续操作 # 方法二:提前计算全局最小值,逻辑更清晰 global_min <- min(df$x) df %>% group_by(gr) %>% filter(any(x == global_min)) %>% ungroup()
运行后就能得到你预期的输出:
# A tibble: 3 × 2 x gr <dbl> <fct> 1 250 3 2 100 3 3 1 3
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

