R语言使用dplyr筛选accident列仅负数中最接近0的值的问题
问题原因
原代码在正负值同时存在的分支中,未过滤正数就直接调用pmax计算,导致正数被纳入取值范围,得到错误结果。
修正方案
可以通过行内提取值、过滤非正数的逻辑实现需求,代码更简洁且完全匹配规则:
library(dplyr) df %>% rowwise() %>% mutate( magic = { # 提取当前行三个accident列的所有值 val_list = c(accident1, accident2, accident3) # 仅保留非NA、且小于等于0的值 valid_neg = val_list[!is.na(val_list) & val_list <= 0] # 没有符合要求的值返回NA,否则返回最大值(即最接近0的负数) if (length(valid_neg) == 0) NA_real_ else max(valid_neg) } ) %>% ungroup()
逻辑说明
该写法不需要拆分多分支判断,天然覆盖所有规则:
- 若所有值都是正数/全为NA:过滤后
valid_neg长度为0,返回NA,匹配规则1、全NA场景 - 若所有值都是负数:过滤后
valid_neg包含所有值,取最大值,匹配规则2 - 若同时存在正负值:过滤后
valid_neg仅包含负数,取最大值,匹配规则3
运行后输出结果和你预期的完全一致。
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

