R语言分组聚合求最小值:全0组返回0的报错解决
分组计算最小值:全0分组返回0的实现方案
问题背景
需要按letters字段分组计算quantities的最小值,当分组内quantities全为0时返回0。原代码因全0分组筛选后为空向量,导致min()报错返回Inf。
解决方案
以下是几种基于dplyr包的可行实现方式:
方法1:用ifelse判断全0分组
library(dplyr) letters <- c("A","A","B","B","B","C") quantities <- c(0,2,0,1,3,0) dtf <- data.frame(letters = letters, quantities = quantities) dtf |> group_by(letters) |> summarize(min_quantity = ifelse(all(quantities == 0), 0, min(quantities[quantities > 0], na.rm = TRUE)))
逻辑说明:
all(quantities == 0)检查当前分组是否所有值都是0- 若是则返回0,否则筛选出大于0的值计算最小值,
na.rm = TRUE避免潜在NA值干扰
方法2:替换Inf为0
利用全0分组时min(quantities[quantities>0])会返回Inf的特性,直接替换结果中的Inf:
dtf |> group_by(letters) |> summarize( min_val = min(quantities[quantities > 0], na.rm = TRUE), min_quantity = ifelse(is.infinite(min_val), 0, min_val), .groups = "drop" # 可选:取消分组状态 )
方法3:用case_when增强可读性
如果需要更复杂的条件判断,case_when会让逻辑更清晰:
dtf |> group_by(letters) |> summarize( min_quantity = case_when( all(quantities == 0) ~ 0, TRUE ~ min(quantities[quantities > 0], na.rm = TRUE) ), .groups = "drop" )
运行结果
三种方法都会输出正确结果:
# A tibble: 3 × 2 letters min_quantity <chr> <dbl> 1 A 2 2 B 1 3 C 0
内容的提问来源于stack exchange,提问作者user3483060
相关产品推荐
相关产品推荐

