如何让dplyr的mutate函数兼容数据框中可能缺失的列完成计算
问题解决方法
方法1:dplyr搭配any_of() + rowSums()(推荐方案)
any_of()为tidyverse内置的选择器,会自动匹配数据框中已存在的目标列,不存在的列直接跳过不会触发报错,代码实现如下:
library(dplyr) # 目标列列表,固定写死a/b/c/d即可,无需提前校验是否存在 target_cols <- c("a", "b", "c", "d") df <- df %>% mutate(total = rowSums(select(., any_of(target_cols)), na.rm = TRUE))
示例数据运行后输出结果:
a b d total 1 11 21 31 63 2 12 22 32 66 3 13 23 33 69 4 14 24 34 72 5 15 25 35 75
方法2:自定义缺失列兜底规则
如果需要对缺失列指定特殊兜底值(而非默认按0计算),可以用列存在性判断的写法:
library(dplyr) df <- df %>% mutate( total = sum( if ("a" %in% colnames(.)) a else 0, if ("b" %in% colnames(.)) b else 0, if ("c" %in% colnames(.)) c else 0, if ("d" %in% colnames(.)) d else 0, na.rm = TRUE ), .by = everything() )
内容的提问来源于stack exchange,提问作者EStark
相关产品推荐
相关产品推荐

