R语言按日期分组统计指定字段有效计数实现方法
R实现按日期分组统计两列非缺失值计数
核心思路
忽略Rej、Old两列,提取App、Proc中所有非NA的日期值,按日期维度分组后分别统计两个字段的有效记录数,最终输出包含Date、App、Proc三列的汇总表即可。
常用实现代码
1. dplyr+tidyr 写法(可读性最高,适合常规数据量场景)
library(dplyr) library(tidyr) DFdesired <- DF1 %>% select(App, Proc) %>% pivot_longer(everything(), names_to = "col", values_to = "Date") %>% filter(!is.na(Date)) %>% count(Date, col) %>% pivot_wider(names_from = col, values_from = n, values_fill = 0)
运行后直接得到符合结构要求的结果:Date列存储去重后的日期值,App、Proc列分别存储对应日期下该字段的非NA有效记录数。
2. data.table 写法(性能最优,适合百万行以上大数据量场景)
library(data.table) setDT(DF1) # 分别统计两个字段的分日期计数 app_stat <- DF1[!is.na(App), .(App = .N), keyby = .(Date = App)] proc_stat <- DF1[!is.na(Proc), .(Proc = .N), keyby = .(Date = Proc)] # 全连接合并结果,无计数的位置补0 DFdesired <- merge(app_stat, proc_stat, all = TRUE) DFdesired[is.na(DFdesired)] <- 0
3. 基础R写法(无需安装加载第三方包)
# 计算两列非NA值的频次 app_count <- table(DF1$App[!is.na(DF1$App)]) proc_count <- table(DF1$Proc[!is.na(DF1$Proc)]) # 提取所有出现过的日期全集 all_date <- sort(unique(c(as.character(names(app_count)), as.character(names(proc_count))))) # 对齐计数组装结果 DFdesired <- data.frame( Date = as.Date(all_date), App = as.integer(app_count[match(all_date, names(app_count))]), Proc = as.integer(proc_count[match(all_date, names(proc_count))]) ) DFdesired[is.na(DFdesired)] <- 0
提示:如果
App、Proc列存储的是字符串格式的日期,先执行以下代码统一转为标准日期类型再统计,避免分组匹配错误:DF1[c("App", "Proc")] <- lapply(DF1[c("App", "Proc")], as.Date)
内容的提问来源于stack exchange,提问作者user17582908
相关产品推荐
相关产品推荐

