You need to enable JavaScript to run this app. 使用dplyr统计含动态日期列DataFrame的每行NA值数量(适配dbplyr场景)
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 11:15:09