使用dplyr统计含动态日期列DataFrame的每行NA值数量(适配dbplyr场景)
实现方案
1. 本地DataFrame计算(已从SQL Server拉取到本地)
使用dplyr的mutate+across+rowSums组合即可实现,无需写死动态日期列名:
library(dplyr) # 统计所有列的NA数量 repro_with_na <- repro %>% mutate(na_count = rowSums(is.na(across(everything())))) # 如果仅需要统计日期列的NA数量,可通过正则匹配列名(适配YYYY-MM-DD格式的动态日期列) repro_with_na <- repro %>% mutate(na_count = rowSums(is.na(across(matches("^\\d{4}-\\d{2}-\\d{2}$"))))) # 也可以通过排除非日期列的方式指定统计范围 repro_with_na <- repro %>% mutate(na_count = rowSums(is.na(across(-c(UPC_Sell_Unit_Desc, `Region Manager_desc`, Area_desc, Location_ID)))))
上述代码在你的示例数据中运行后,第5行的na_count结果为1,对应唯一的2021-05-11列的NA值,符合预期。
2. SQL端计算(未拉取本地,仍在dbplyr处理流程中)
如果数据还未通过collect()拉取到本地,需要适配SQL语法,可使用如下写法让计算直接在SQL Server端运行:
repro_with_na <- repro %>% mutate(na_count = rowSums(across(matches("^\\d{4}-\\d{2}-\\d{2}$"), ~ifelse(is.na(.), 1, 0))))
逻辑说明
is.na()会将值为NA的位置转为TRUE(数值计算时等价于1),非NA位置转为FALSE(数值计算时等价于0)across配合选择器可以灵活匹配动态变化的日期列,不需要手动硬编码列名rowSums按行对逻辑值求和,最终得到每行的NA数量
内容的提问来源于stack exchange,提问作者Jeremy R. Johnson
相关产品推荐
相关产品推荐

