Если вам не нужно использовать пакет assertr
, я думаю, что это решение можно рассмотреть.
library(tidyverse)
verify_not_missing <- function(.data) {
col_na <- colSums(is.na(.data)) > 0 # larger than zero, than na value in that column
if (any(col_na)) stop(gettextf("column %s is missing",
str_c(names(col_na)[col_na], collapse = ", ")))
}
Используя colSums(is.na(.))
, вы можете обнаружить столбцы со значениями NA
.Если такой столбец существует, может быть легко напечатать сообщение об ошибке с именами его столбцов.
Кроме того, я сверну names()
для случая с несколькими столбцами.
Применяя к вашему набору данных, мыможет получить результат:
df %>%
verify_not_missing()
#> Error in verify_not_missing(.): column value is missing
Аналогично, для дополнительного столбца со значениями NA
,
(mydf2 <- tibble(id = 1:10, value = rnorm(10, 0, 1)) %>%
mutate(value1 = if_else(abs(value) < 0.5, NA_real_, value),
value2 = if_else(abs(value) < 0.5, NA_real_, value)))
#> # A tibble: 10 x 4
#> id value value1 value2
#> <int> <dbl> <dbl> <dbl>
#> 1 1 1.51 1.51 1.51
#> 2 2 0.390 NA NA
#> 3 3 -0.621 -0.621 -0.621
#> 4 4 -2.21 -2.21 -2.21
#> 5 5 1.12 1.12 1.12
#> 6 6 -0.0449 NA NA
#> 7 7 -0.0162 NA NA
#> 8 8 0.944 0.944 0.944
#> 9 9 0.821 0.821 0.821
#> 10 10 0.594 0.594 0.594
mydf2 %>%
verify_not_missing()
#> Error in verify_not_missing(.): column value1, value2 is missing
Он печатает value1, value2
, который включает NA
.
Правка - Добавление аргумента столбца
Вы можете просто enquo(v)
и затем использовать %>% select(!!v)
.Затем он возвращает столбцы для v
.Остальные части одинаковы.
verify_not_missing2 <- function(.data, v) {
v <- enquo(v)
col_na <-
.data %>%
select(!!v) %>% # this returns v columns
is.na() %>%
colSums()
col_na <- col_na > 0
if (any(col_na)) stop(gettextf("column %s is missing",
str_c(names(col_na)[col_na], collapse = ", ")))
}
Применяя это к примеру,
df %>%
verify_not_missing2(value)
#> Error in verify_not_missing2(., value): column value is missing
Указав value
в качестве аргумента, вы можете получить ошибку.Кроме того, для нескольких столбцов NA
,
mydf2 %>%
verify_not_missing2(value)
#---------------------------
mydf2 %>%
verify_not_missing2(value1)
#> Error in verify_not_missing2(., value1): column value1 is missing
Когда вы вводите столбец, который не является ни value1
, ни value2
, ничего не будет напечатано.С другой стороны, вы получите ошибку с указанным value1
.
Кроме того, вы можете указать несколько столбцов с помощью c()
.
mydf2 %>%
verify_not_missing2(v = c("value1", "value2"))
#> Error in verify_not_missing2(., v = c("value1", "value2")): column value1, value2 is missing
#----------------------------
mydf2 %>%
verify_not_missing2(v = c(value1, value2))
#> Error in verify_not_missing2(., v = c(value1, value2)): column value1, value2 is missing
Edit2 - получение исходных данных
verify_not_missing3 <- function(.data, v) {
v <- enquo(v)
col_na <-
.data %>%
select(!!v) %>%
is.na() %>%
colSums()
col_na <- col_na > 0
if (any(col_na)) {
stop(gettextf("column %s is missing",
str_c(names(col_na)[col_na], collapse = ", ")))
} else {
.data
}
}
Дополнительный оператор else { .data }
может возвращаться в случае отсутствия ошибок.
Если вы даете value
,
mydf2 %>%
verify_not_missing3(value)
#> # A tibble: 10 x 4
#> id value value1 value2
#> <int> <dbl> <dbl> <dbl>
#> 1 1 1.51 1.51 1.51
#> 2 2 0.390 NA NA
#> 3 3 -0.621 -0.621 -0.621
#> 4 4 -2.21 -2.21 -2.21
#> 5 5 1.12 1.12 1.12
#> 6 6 -0.0449 NA NA
#> 7 7 -0.0162 NA NA
#> 8 8 0.944 0.944 0.944
#> 9 9 0.821 0.821 0.821
#> 10 10 0.594 0.594 0.594
С другой стороны,
mydf2 %>%
verify_not_missing3(value1)
#> Error in verify_not_missing3(., value1): column value1 is missing