R проверка пакета var_group — определение списка входных переменных?

#r

Вопрос:

Я пытаюсь использовать пакет проверки для определения набора правил проверки. У меня много переменных, и есть много правил, которые применяются к одному и тому же набору переменных неоднократно.

Я хотел бы избежать повторного перечисления одних и тех же (длинных) списков переменных, но я не могу понять, как определить список переменных, которые будет принимать var_group.

Например, следующее работает без проблем:

 
df <- data.frame(A=c(1,2,NA,4,5), B=c(10,NA,30,40,50), C=c(NA,200,300,4,500))

rules <- validator(!is.na(var_group(A,B,C))
                   , var_group(B,C)>= 10)

out <- confront(df, rules)
summary(out)

###output: 

  name items passes fails nNA error warning         expression
1 V1.1     5      4     1   0 FALSE   FALSE          !is.na(A)
2 V1.2     5      4     1   0 FALSE   FALSE          !is.na(B)
3 V1.3     5      4     1   0 FALSE   FALSE          !is.na(C)
4 V2.1     5      4     0   1 FALSE   FALSE (B - 10) >= -1e-08
5 V2.2     5      3     1   1 FALSE   FALSE (C - 10) >= -1e-08
 

Однако, если я попытаюсь определить «A,B,C» или «B,C» как списки, он считывает список переменных в виде текстовой строки.

Например:

 
df <- data.frame(A=c(1,2,NA,4,5), B=c(10,NA,30,40,50), C=c(NA,200,300,4,500))

vars_all <- names(df) 
vars_large <- c("B", "C")

rules <- validator(!is.na(var_group(paste(vars_all, collapse=", ")))
                   , var_group(paste(vars_large, collapse=", "))>= 10)

out <- confront(df, rules)
summary(out)

###output: 
  name items passes fails nNA error warning                               expression
1 V1.1     1      1     0   0 FALSE   FALSE !is.na(paste(vars_all, collapse = ", "))
2 V2.1     1      1     0   0 FALSE   FALSE paste(vars_large, collapse = ", ") >= 10
 

Я попробовал несколько различных вариантов вставки, удаления списка и т. Д.
Я уверен, что упускаю что-то очень простое.

Кто-нибудь знает, как добиться такого результата? или если есть другой пакет, который может обеспечить эту функциональность?

Заранее спасибо.

Ответ №1:

Если вы хотите создавать правила динамически, вам необходимо передать свои правила в качестве символьных значений в data.frame .data= параметру

 rule_data <- data.frame(rule=c(
  paste0("!is.na(var_group(", paste(vars_all, collapse=", "), "))"),
  paste0("var_group(", paste(vars_large, collapse=", "), ")>=10")
))
rules <- validator(.data=rule_data)

out <- confront(df, rules)
summary(out)
 

результаты в

   name items passes fails nNA error warning
1 V1.1     5      4     1   0 FALSE   FALSE
2 V1.2     5      4     1   0 FALSE   FALSE
3 V1.3     5      4     1   0 FALSE   FALSE
4 V2.1     5      4     0   1 FALSE   FALSE
5 V2.2     5      3     1   1 FALSE   FALSE
          expression
1          !is.na(A)
2          !is.na(B)
3          !is.na(C)
4 (B - 10) >= -1e-08
5 (C - 10) >= -1e-08