R语言如何对错位缺失的数据框按Region分组统计Event数量
错位数据Region-Event计数方案
问题说明
- 数万行导出数据因加载错误存在列错位、值缺失问题,规律为Region值会错填到后续行的Event列位置,Event字段取值固定
- 原有直接按现有Region、Event列分组计数的dplyr逻辑无法识别错位数据,会出现大量漏算
- 示例数据构造代码:
df <- data.frame(Region=c(NA,'region2','region1',NA,'region3','region3',NA,'region5'), Event=c('region1','event1','event1','region2','event1','event1','region4','event1'), Campaign=c('event1','campaign2','campaing1','event1','campaing1','campaign2','event1',NA))
- 原有错误统计代码:
df <- df %>% select(Region, Event) %>% group_by(Region, Event) %>% summarise(Event = n())
实现逻辑
核心处理步骤分为4步:
- 先定义业务侧固定的合法Event取值集合,作为判断行是否错位的依据
- 逐行识别错位行:Event列取值不在合法Event列表的行即为错位行,错位行的真实Region取自当前行Event列的错位值,真实Event取自后续列(示例中为Campaign列)的对应值;非错位行直接取对应列的原始值
- 用向前填充逻辑补全所有行的真实Region归属,解决原始Region列的NA缺失问题
- 过滤掉真实Event不合法的异常行,按真实Region分组计数即可
可直接运行的代码
library(dplyr) library(tidyr) # 替换为业务实际的合法Event取值集合 valid_events <- c("event1") df_fixed <- df %>% mutate( # 标记当前行是否为列错位行 is_misaligned = !Event %in% valid_events, # 提取当前行的真实Region值 real_region = ifelse(is_misaligned, Event, Region), # 提取当前行的真实Event值 real_event = ifelse(is_misaligned, Campaign, Event) ) %>% # 向前填充Region,补全所有行的Region归属 fill(real_region, .direction = "down") %>% # 仅保留Event合法的有效数据行 filter(real_event %in% valid_events) # 分组统计每个Region对应的Event数量 count_result <- df_fixed %>% group_by(region = real_region) %>% summarise(event_total = n(), .groups = "drop")
示例数据运行结果
针对提供的示例数据,运行后得到的正确计数结果为:
- region1:2条
- region2:2条
- region3:2条
- region4:1条
- region5:1条
适配说明
- 如果实际数据错位偏移列数和示例不一致,只需要调整
real_region、real_event取值对应的列名即可,核心逻辑无需改动 - 数万行规模数据下该代码运行效率充足,无需额外性能优化
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

