#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