如何在dplyr的mutate中添加含NA的final_score求和列?
解决方案:在同一mutate中生成final_score列
核心逻辑
在同一个mutate块中,先完成col_scr和grd_scr的生成,再通过**rowSums+条件判断**实现NA求和规则:单个NA与数值相加取数值,双NA则保留NA。
完整代码示例
library(dplyr) # 构造带NA的测试数据框 df <- tibble( id = 1:5, color = c("red", "blue", NA, "red", NA), grade = c("A", NA, "B", NA, NA) ) # 一次性完成三列生成的mutate代码 df_processed <- df %>% mutate( # 生成col_scr(示例规则,可根据实际需求修改) col_scr = case_when( color == "red" ~ 10, color == "blue" ~ 20, TRUE ~ NA_real_ ), # 生成grd_scr(示例规则,可根据实际需求修改) grd_scr = case_when( grade == "A" ~ 30, grade == "B" ~ 20, TRUE ~ NA_real_ ), # 生成final_score:处理NA求和规则 final_score = ifelse( is.na(col_scr) & is.na(grd_scr), # 判断是否双NA NA_real_, # 双NA返回NA rowSums(cbind(col_scr, grd_scr), na.rm = TRUE) # 单NA时忽略NA求和 ) )
代码说明
rowSums(cbind(col_scr, grd_scr), na.rm = TRUE):自动忽略单个NA,仅对存在的数值求和;- 外层
ifelse专门处理双NA场景,避免rowSums将双NA转换为0; - 所有计算在同一个
mutate块内完成,无需拆分步骤。
输出结果
df_processed #> # A tibble: 5 × 6 #> id color grade col_scr grd_scr final_score #> <int> <chr> <chr> <dbl> <dbl> <dbl> #> 1 1 red A 10 30 40 #> 2 2 blue NA 20 NA 20 #> 3 3 NA B NA 20 20 #> 4 4 red NA 10 NA 10 #> 5 5 NA NA NA NA NA
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

