Diagnostics and Quality Checks
Duplicate Check
Find Repeated IDs
Repeated identifiers can merge records incorrectly unless the policy is explicit.
Program
Play the script to change the duplicate policy and see the resulting action.
duplicate_check.R
Replay: real traced execution (multi-file project)
policy_index <- 2
id <- c("A1", "B2", "A1", "C3")
policy <- c("ignore", "flag", "stop")[policy_index]
duplicate_id <- unique(id[duplicated(id)])
duplicate_count <- length(duplicate_id)
action <- if (duplicate_count == 0) "ok" else policy
label <- paste(action, duplicate_count, sep = ":")
cat(label, "\n", sep = "")
policy_index <- 1
id <- c("A1", "B2", "A1", "C3")
policy <- c("ignore", "flag", "stop")[policy_index]
duplicate_id <- unique(id[duplicated(id)])
duplicate_count <- length(duplicate_id)
action <- if (duplicate_count == 0) "ok" else policy
label <- paste(action, duplicate_count, sep = ":")
cat(label, "\n", sep = "")
policy_index <- 3
id <- c("A1", "B2", "A1", "C3")
policy <- c("ignore", "flag", "stop")[policy_index]
duplicate_id <- unique(id[duplicated(id)])
duplicate_count <- length(duplicate_id)
action <- if (duplicate_count == 0) "ok" else policy
label <- paste(action, duplicate_count, sep = ":")
cat(label, "\n", sep = "")
policy_index ← 2
1policy_index <- 22id <- c("A1", "B2", "A1", "C3")values this step2policy_indexid ← A1, B2, A1, C3
1policy_index <- 22id <- c("A1", "B2", "A1", "C3")3policy <- c("ignore", "flag", "stop")[policy_index]values this stepA1, B2, A1, C3idpolicy ← flag
2id <- c("A1", "B2", "A1", "C3")3policy <- c("ignore", "flag", "stop")[policy_index]4duplicate_id <- unique(id[duplicated(id)])values this stepflagpolicy2policy_indexduplicate_id ← A1
3policy <- c("ignore", "flag", "stop")[policy_index]4duplicate_id <- unique(id[duplicated(id)])5duplicate_count <- length(duplicate_id)values this stepA1duplicate_idA1 repeatsidduplicate_count ← 1
4duplicate_id <- unique(id[duplicated(id)])5duplicate_count <- length(duplicate_id)6action <- if (duplicate_count == 0) "ok" else policyvalues this step1duplicate_countA1duplicate_idaction ← flag
5duplicate_count <- length(duplicate_id)6action <- if (duplicate_count == 0) "ok" else policy7label <- paste(action, duplicate_count, sep = ":")values this stepflagaction1duplicate_countflagpolicylabel ← flag:1
6action <- if (duplicate_count == 0) "ok" else policy7label <- paste(action, duplicate_count, sep = ":")8cat(label, "\n", sep = "")values this stepflag:1labelflagaction1duplicate_countcat(label, " ", sep = "")
7label <- paste(action, duplicate_count, sep = ":")8cat(label, "\n", sep = "")outputflag:1values this stepflag:1label
policy_index ← 1
1policy_index <- 12id <- c("A1", "B2", "A1", "C3")values this step1policy_indexid ← A1, B2, A1, C3
1policy_index <- 12id <- c("A1", "B2", "A1", "C3")3policy <- c("ignore", "flag", "stop")[policy_index]values this stepA1, B2, A1, C3idpolicy ← ignore
2id <- c("A1", "B2", "A1", "C3")3policy <- c("ignore", "flag", "stop")[policy_index]4duplicate_id <- unique(id[duplicated(id)])values this stepignorepolicy1policy_indexduplicate_id ← A1
3policy <- c("ignore", "flag", "stop")[policy_index]4duplicate_id <- unique(id[duplicated(id)])5duplicate_count <- length(duplicate_id)values this stepA1duplicate_idA1 repeatsidduplicate_count ← 1
4duplicate_id <- unique(id[duplicated(id)])5duplicate_count <- length(duplicate_id)6action <- if (duplicate_count == 0) "ok" else policyvalues this step1duplicate_countA1duplicate_idaction ← ignore
5duplicate_count <- length(duplicate_id)6action <- if (duplicate_count == 0) "ok" else policy7label <- paste(action, duplicate_count, sep = ":")values this stepignoreaction1duplicate_countignorepolicylabel ← ignore:1
6action <- if (duplicate_count == 0) "ok" else policy7label <- paste(action, duplicate_count, sep = ":")8cat(label, "\n", sep = "")values this stepignore:1labelignoreaction1duplicate_countcat(label, " ", sep = "")
7label <- paste(action, duplicate_count, sep = ":")8cat(label, "\n", sep = "")outputignore:1values this stepignore:1label
policy_index ← 3
1policy_index <- 32id <- c("A1", "B2", "A1", "C3")values this step3policy_indexid ← A1, B2, A1, C3
1policy_index <- 32id <- c("A1", "B2", "A1", "C3")3policy <- c("ignore", "flag", "stop")[policy_index]values this stepA1, B2, A1, C3idpolicy ← stop
2id <- c("A1", "B2", "A1", "C3")3policy <- c("ignore", "flag", "stop")[policy_index]4duplicate_id <- unique(id[duplicated(id)])values this stepstoppolicy3policy_indexduplicate_id ← A1
3policy <- c("ignore", "flag", "stop")[policy_index]4duplicate_id <- unique(id[duplicated(id)])5duplicate_count <- length(duplicate_id)values this stepA1duplicate_idA1 repeatsidduplicate_count ← 1
4duplicate_id <- unique(id[duplicated(id)])5duplicate_count <- length(duplicate_id)6action <- if (duplicate_count == 0) "ok" else policyvalues this step1duplicate_countA1duplicate_idaction ← stop
5duplicate_count <- length(duplicate_id)6action <- if (duplicate_count == 0) "ok" else policy7label <- paste(action, duplicate_count, sep = ":")values this stepstopaction1duplicate_countstoppolicylabel ← stop:1
6action <- if (duplicate_count == 0) "ok" else policy7label <- paste(action, duplicate_count, sep = ":")8cat(label, "\n", sep = "")values this stepstop:1labelstopaction1duplicate_countcat(label, " ", sep = "")
7label <- paste(action, duplicate_count, sep = ":")8cat(label, "\n", sep = "")outputstop:1values this stepstop:1label
identifier
An ID column should usually identify one record.
duplicate scan
`duplicated(id)` marks repeated IDs after their first appearance.
policy
The duplicate policy decides whether to ignore, flag, or stop.