A data quality check should make missing values visible before analysis continues.

Program

Play the script to change the allowed number of missing values and see the quality status.

allowed_missing
missing_rate.R
Replay: real traced execution (multi-file project)
allowed_missing <- 1
score <- c(91, NA, 88, NA, 76)
missing <- is.na(score)
missing_count <- sum(missing)
status <- if (missing_count <= allowed_missing) "ok" else "review"
label <- paste(status, missing_count, sep = ":")
cat(label, "\n", sep = "")
allowed_missing <- 0
score <- c(91, NA, 88, NA, 76)
missing <- is.na(score)
missing_count <- sum(missing)
status <- if (missing_count <= allowed_missing) "ok" else "review"
label <- paste(status, missing_count, sep = ":")
cat(label, "\n", sep = "")
allowed_missing <- 2
score <- c(91, NA, 88, NA, 76)
missing <- is.na(score)
missing_count <- sum(missing)
status <- if (missing_count <= allowed_missing) "ok" else "review"
label <- paste(status, missing_count, sep = ":")
cat(label, "\n", sep = "")
  1. allowed_missing ← 1

    1allowed_missing <- 12score <- c(91, NA, 88, NA, 76)
    values this step1allowed_missing
  2. score ← 91, NA, 88, NA, 76

    1allowed_missing <- 12score <- c(91, NA, 88, NA, 76)3missing <- is.na(score)
    values this step91, NA, 88, NA, 76score
  3. missing ← FALSE, TRUE, FALSE, TRUE, FALSE

    2score <- c(91, NA, 88, NA, 76)3missing <- is.na(score)4missing_count <- sum(missing)
    values this stepFALSE, TRUE, FALSE, TRUE, FALSEmissing5 valuesscore
  4. missing_count ← 2

    3missing <- is.na(score)4missing_count <- sum(missing)5status <- if (missing_count <= allowed_missing) "ok" else "review"
    values this step2missing_count2 missing valuesmissing
  5. status ← review

    4missing_count <- sum(missing)5status <- if (missing_count <= allowed_missing) "ok" else "review"6label <- paste(status, missing_count, sep = ":")
    values this stepreviewstatus2missing_count1allowed_missing
  6. label ← review:2

    5status <- if (missing_count <= allowed_missing) "ok" else "review"6label <- paste(status, missing_count, sep = ":")7cat(label, "\n", sep = "")
    values this stepreview:2labelreviewstatus2missing_count
  7. cat(label, " ", sep = "")

    6label <- paste(status, missing_count, sep = ":")7cat(label, "\n", sep = "")
    outputreview:2
    values this stepreview:2label
  1. allowed_missing ← 0

    1allowed_missing <- 02score <- c(91, NA, 88, NA, 76)
    values this step0allowed_missing
  2. score ← 91, NA, 88, NA, 76

    1allowed_missing <- 02score <- c(91, NA, 88, NA, 76)3missing <- is.na(score)
    values this step91, NA, 88, NA, 76score
  3. missing ← FALSE, TRUE, FALSE, TRUE, FALSE

    2score <- c(91, NA, 88, NA, 76)3missing <- is.na(score)4missing_count <- sum(missing)
    values this stepFALSE, TRUE, FALSE, TRUE, FALSEmissing5 valuesscore
  4. missing_count ← 2

    3missing <- is.na(score)4missing_count <- sum(missing)5status <- if (missing_count <= allowed_missing) "ok" else "review"
    values this step2missing_count2 missing valuesmissing
  5. status ← review

    4missing_count <- sum(missing)5status <- if (missing_count <= allowed_missing) "ok" else "review"6label <- paste(status, missing_count, sep = ":")
    values this stepreviewstatus2missing_count0allowed_missing
  6. label ← review:2

    5status <- if (missing_count <= allowed_missing) "ok" else "review"6label <- paste(status, missing_count, sep = ":")7cat(label, "\n", sep = "")
    values this stepreview:2labelreviewstatus2missing_count
  7. cat(label, " ", sep = "")

    6label <- paste(status, missing_count, sep = ":")7cat(label, "\n", sep = "")
    outputreview:2
    values this stepreview:2label
  1. allowed_missing ← 2

    1allowed_missing <- 22score <- c(91, NA, 88, NA, 76)
    values this step2allowed_missing
  2. score ← 91, NA, 88, NA, 76

    1allowed_missing <- 22score <- c(91, NA, 88, NA, 76)3missing <- is.na(score)
    values this step91, NA, 88, NA, 76score
  3. missing ← FALSE, TRUE, FALSE, TRUE, FALSE

    2score <- c(91, NA, 88, NA, 76)3missing <- is.na(score)4missing_count <- sum(missing)
    values this stepFALSE, TRUE, FALSE, TRUE, FALSEmissing5 valuesscore
  4. missing_count ← 2

    3missing <- is.na(score)4missing_count <- sum(missing)5status <- if (missing_count <= allowed_missing) "ok" else "review"
    values this step2missing_count2 missing valuesmissing
  5. status ← ok

    4missing_count <- sum(missing)5status <- if (missing_count <= allowed_missing) "ok" else "review"6label <- paste(status, missing_count, sep = ":")
    values this stepokstatus2missing_count2allowed_missing
  6. label ← ok:2

    5status <- if (missing_count <= allowed_missing) "ok" else "review"6label <- paste(status, missing_count, sep = ":")7cat(label, "\n", sep = "")
    values this stepok:2labelokstatus2missing_count
  7. cat(label, " ", sep = "")

    6label <- paste(status, missing_count, sep = ":")7cat(label, "\n", sep = "")
    outputok:2
    values this stepok:2label
missing marker `NA` marks values that are not available.
diagnostic vector `is.na(score)` checks each value independently.
quality gate `allowed_missing` makes the pass/fail threshold explicit.