在R中用data.table实现类Excel COUNTIFS的高效数据校验
基于data.table的She-He映射标记方案
原始数据集
dt <- data.table(F = c(1, 2, 3, 4, 5, 6, 7, 7, 4, 6, 7, 5), M = c("a", "b", "c", "b", "c", "a", "d", "d", "b", "b", "d", "c")); colnames(dt)=c("She","He");
需求说明
- 采用高效方法(优先data.table)适配超大数据集
- 识别异常场景:
She列的每个值应仅对应He列的唯一值,例如She=6同时对应He=a和He=b属于异常 - 新增标记列:
1标记异常场景中的对应行,0标记正常映射行(预期结果:c(0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0)) - 不得修改原数据的排序或进行聚合操作
解决方案代码
library(data.table) # 分步计算标记列,全程保留原数据顺序 dt[, count := .N, by = .(She, He)] dt[, unique_he_count := uniqueN(He), by = She] dt[, is_correct := ifelse(unique_he_count > 1 & count == 1, 1, 0)] # 可选:删除中间计算列 dt[, c("count", "unique_he_count") := NULL]
代码说明
by = .(She, He)分组计算每个She-He组合的出现次数,得到count列by = She分组计算每个She对应的不同He值数量,得到unique_he_count列- 通过条件判断生成标记列:当
She对应多个不同He,且当前行的He在该She组中仅出现一次时,标记为1,其余情况标记为0 - data.table的分组操作基于底层C实现,内存占用低、处理速度快,完全适配超大数据集,且全程不会改变原数据的行顺序
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

