You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决R语言max()函数出现‘no non-missing arguments to max; returning -Inf’警告

解决分组计算最大值时全NA组返回NA的问题

你可以通过以下两种方式实现需求:让全NA分组返回NA、非全NA分组计算有效最大值,同时消除警告:

方法一:自定义安全max函数

先定义一个函数,判断当前分组的Var_2是否全为NA:如果是则返回NA,否则计算去除NA后的最大值:

library(dplyr)

df <- data.frame(Var_1 = c("Grp 1", "Grp 1", "Grp 1", "Grp 2", "Grp 2", "Grp 2", "Grp 3", "Grp 3", "Grp 3"),
                 Var_2 = c(1,2,3, NA, NA, NA, 7, NA, 9))

# 自定义安全最大值函数
safe_max <- function(x) {
  if (all(is.na(x))) {
    NA_real_  # 明确返回数值型NA
  } else {
    max(x, na.rm = TRUE)
  }
}

# 分组计算
ck <- df %>%
  group_by(Var_1) %>%
  summarise(max_var = safe_max(Var_2), .groups = "drop")  # .groups = "drop" 取消分组状态

print(ck)

输出结果完全符合你的期望:

Var_1 max_var
  <chr>   <dbl>
1 Grp 1       3
2 Grp 2      NA
3 Grp 3       9

方法二:用case_when直接判断

如果不想额外定义函数,也可以在summarise里用case_when做条件判断:

ck <- df %>%
  group_by(Var_1) %>%
  summarise(
    max_var = case_when(
      all(is.na(Var_2)) ~ NA_real_,
      TRUE ~ max(Var_2, na.rm = TRUE)
    ),
    .groups = "drop"
  )

这个写法和自定义函数的效果完全一致。

问题根源说明

  • 不添加na.rm = TRUE时,max()只要遇到一个NA就会返回NA,所以Grp3因存在NA值,结果变成NA;
  • 添加na.rm = TRUE时,全NA的分组会被处理成空向量,max()对空向量返回-Inf并抛出警告——这是R基础函数的默认行为;
  • 上面的两种方法都是先判断分组是否全为NA,再决定返回值,完美规避了这两个问题。

内容的提问来源于stack exchange,提问作者Songlin Tong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:17:50