如何在validate包中构建取较大值的验证规则识别异常值
解决validate包中动态取最大值作为异常值左边界的问题
要实现cd_hr_Day1大于cd_hr_Day1_left与55中的较大值,核心是用R的pmax()函数——它能逐元素比较两个(或多个)向量,返回对应位置的最大值,完美适配每行数据动态取边界的需求。
修改验证规则
直接在原有的validator规则中,将cd_hr_Day1_left替换为pmax(cd_hr_Day1_left, 55)即可,修改后的规则如下:
test_rules <- validator( "cd_hr_Day1_outlier"= (cd_hr_Day1 > pmax(cd_hr_Day1_left, 55) & cd_hr_Day1 < cd_hr_Day1_right))
完整修改后代码
library(validate) library(tidyverse) library(dplyr) library(gt) study_id <- c(1,2,3,4,5) cd_hr_Day1 <- c(80,NA,105,45,78) cd_hr_Day1_left <- c(70,70,70,70,70) cd_hr_Day1_right <- c(85,85,85,85,85) baseline_df_test <- data.frame(study_id, cd_hr_Day1, cd_hr_Day1_left, cd_hr_Day1_right) # 修改后的验证规则 test_rules <- validator( "cd_hr_Day1_outlier"= (cd_hr_Day1 > pmax(cd_hr_Day1_left, 55) & cd_hr_Day1 < cd_hr_Day1_right)) test_output <- confront(baseline_df_test, test_rules,key = "study_id") summary(test_output) test_dout <- as.data.frame(test_output) test_missing_or_outlier_data <- test_dout %>% dplyr::filter(!value == TRUE) %>% dplyr::select(study_id,name) %>% dplyr::arrange(study_id) test_missing_or_outlier_data %>% gt()
效果说明
- 对于测试数据中
cd_hr_Day1_left=70的行,pmax(70,55)返回70,规则逻辑和原规则一致; - 如果某行
cd_hr_Day1_left=50,pmax(50,55)会返回55,此时cd_hr_Day1需要大于55才算符合规则,自动启用更高的边界值。
内容的提问来源于stack exchange,提问作者GJW
相关产品推荐
相关产品推荐

