dplyr中mutate用which.max()遇全NA行返回integer(0)而非NA的解决方法
解决dplyr中计算每行最大值列位置时全NA行报错的问题
方法一:在mutate中直接加入条件判断
通过检测当前行是否全为NA,针对性返回结果,避免which.max()返回空整数向量引发的报错:
data.frame(v1 = c(3,2,NA,6,NA), v2 = c(NA,1,6,7,NA), v3 = c(1,1,NA,1,NA)) -> df1 df1 %>% rowwise %>% mutate(maxCol = if(all(is.na(c_across(everything())))) NA_integer_ else which.max(c_across(everything())))
方法二:自定义可复用函数
将全NA判断逻辑封装成函数,让代码更整洁,适合多次调用的场景:
# 定义处理函数:全NA行返回NA,否则返回最大值所在列位置 which_max_na <- function(x) { if(all(is.na(x))) NA_integer_ else which.max(x) } df1 %>% rowwise %>% mutate(maxCol = which_max_na(c_across(everything())))
关键说明
all(is.na(c_across(everything())))用于精准检测当前行是否所有值均为NA;- 使用
NA_integer_确保返回值为整数类型的NA,避免新变量出现类型不一致问题; - 两种方法都保留了
which.max()忽略部分NA的原有逻辑,仅对全NA行做特殊处理。
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

