R语言validate包如何将同一套校验规则应用到多个指定列?
validate包批量校验多列的两种实现方案
你之前的写法错误原因:v1:v20在R默认语法中代表生成1到20的整数序列,不是指代数据框中的v1到v20列,因此validator不会对每列单独执行校验,返回的结果不符合预期。
方法1:使用内置批量规则生成语法(推荐)
validate包原生支持通过占位符批量生成多列的校验规则,生成的规则会自动关联对应列名,校验结果可以直接看到哪列不满足规则:
library(tidyverse) library(validate) # 定义要校验的变量范围 check_cols <- paste0("v", 1:20) # 批量生成校验规则 rules <- validator( .var = check_cols, num.val = is.numeric(.var), big.val = !(.var > 10), low.val = !(.var < -10), NA.val = !is.na(.var) ) # 执行校验查看结果 df %>% confront(rules) %>% summary()
返回的summary结果中,expression列会显示每个规则对应的具体列名,可以直接定位校验不通过的变量。
方法2:长表校验后关联原始数据定位明细
如果你需要定位到具体某一行的某一列校验失败,可以把校验结果和长表数据绑定后筛选:
# 生成长表保留变量名 df_long <- df %>% pivot_longer(v1:v20, names_to = "var_name", values_to = "value") # 执行校验 check_res <- confront(df_long, validator( num.val = is.numeric(value), big.val = !(value > 10), low.val = !(value < -10), NA.val = !is.na(value) )) # 关联原始数据,筛选出校验不通过的记录 failed_records <- bind_cols(df_long, as.data.frame(check_res)) %>% filter(!big.val | !low.val | !NA.val)
查看failed_records即可看到所有校验失败的行id、对应的变量名、变量值和校验结果。
内容的提问来源于stack exchange,提问作者Marek Fiołka
相关产品推荐
相关产品推荐

