Использование testthat для проверки каждой переменной в фрейме данных на значения NA - PullRequest
0 голосов
/ 17 февраля 2020

Я строю набор данных из очень грязных необработанных файлов и использую testthat, чтобы убедиться, что ничего не сломалось при добавлении новых данных или исправлении правил очистки. Я хотел бы добавить тест, чтобы увидеть, есть ли в данных какие-либо значения NA, и, если да, сообщить, в каких столбцах они находятся.

Это тривиально, сделать это вручную, написав тест для каждого столбца. Но это решение будет проблематичным и подверженным ошибкам, так как я не хочу помнить, что нужно обновлять файл test-NA каждый раз, когда столбец добавляется или удаляется из набора данных.

Вот пример код для того, что у меня есть

df <- tidyr::tribble(
  ~A, ~B, ~C, 
  1, 2, 3,
  NA, 2, 3, 
  1, 2, NA
)

# checks all variables, doesn't report which have NA values
testthat::test_that("NA Values", {
  testthat::expect_true(sum(is.na(df)) == 0)
})

# Checks each column, but is a pain to maintain
testthat::test_that("Variable specific checks", {
  testthat::expect_true(sum(is.na(df$A)) == 0)
  testthat::expect_true(sum(is.na(df$B)) == 0)
  testthat::expect_true(sum(is.na(df$C)) == 0)
})

1 Ответ

0 голосов
/ 18 февраля 2020

Решение 1: быстрое и (не очень) грязное

df <- tidyr::tribble(
  ~A, ~B, ~C, 
  1, 2, 3,
  NA, 2, 3, 
  1, 2, NA
)

# Checks each column, but is a pain to maintain
testthat::test_that("Variable specific checks", {
    res <- apply(df, 2, function(x) sum(is.na(x))>0)
    testthat::expect_true(all(res), label = paste(paste(which(res), collapse=", "), "contain(s) NA(s)"))
})

, которое должно вернуть

Error: Test failed: 'Variable specific checks'
* 1, 3 contain(s) NA isn't true.

Решение 2: адаптировать функцию wait_ () к вашим потребностям

expect_true2 <- function(object, info = NULL, label = NULL) {
        act <- testthat::quasi_label(rlang::enquo(object), label, arg = "object")
        testthat::expect(identical(as.vector(act$val), TRUE), sprintf("Column %s contain(s) NA(s).", 
            act$lab), info = info)
        invisible(act$val)
    }
testthat::test_that("Variable specific checks", {
    res <- apply(df, 2, function(x) sum(is.na(x))>0)
    expect_true2(all(res), label = paste(which(res), collapse=","))
})

, который должен вернуть

Error: Test failed: 'Variable specific checks'
* Column 1,3 contain(s) NA(s).
...