R语言使用mutate+case_when调用Closest处理全NA行时报错如何解决?
问题原因
报错的核心触发点是全NA行(示例中的第4行)的三个accident字段无任何有效值:
- 调用
pmax/pmin处理全NA输入时,会触发「无有效参数返回Inf」的警告 - 调用
Closest处理全NA输入时会返回长度为0的结果,不符合rowwise下mutate要求每行返回1个标量的规则,直接抛出长度不匹配错误
修正方案
可以直接简化原有冗余的分支判断逻辑,提前对每行的accident值做全NA校验,无有效值时直接返回NA即可,修正后代码如下:
library(DescTools) library(dplyr) df <- data.frame(id=1:4, accident1=c(-1,3,4, NA), accident2=c(100, -2, NA, NA), accident3=c(-3,1,2, NA)) df %>% rowwise() %>% mutate(magic = { # 提取当前行所有事故间隔值 interval_vals <- c(accident1, accident2, accident3) # 全NA直接返回NA,否则计算最接近0的值 if (all(is.na(interval_vals))) { NA_real_ } else { Closest(interval_vals, 0, na.rm = TRUE) } }) %>% ungroup()
输出结果
运行后得到符合预期的结果,全NA行的magic值自动返回NA:
id accident1 accident2 accident3 magic <int> <dbl> <dbl> <dbl> <dbl> 1 1 -1 100 -3 -1 2 2 3 -2 1 1 3 3 4 NA 2 2 4 4 NA NA NA NA
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

