自定义离群值检测函数开发:if语句返回值问题排查
修复自定义离群值检测函数的问题
原函数的问题出在if语句的用法上——R里的if只会评估向量的第一个元素逻辑值,没法批量判断所有元素,所以只能返回单个值,达不到预期的批量筛选效果。
修正后的代码
my_outlier <- function(x, th) { q1 <- quantile(x, 0.25) q3 <- quantile(x, 0.75) rg <- q3 - q1 lower_bound <- q1 - (th * rg) upper_bound <- q3 + (th * rg) # 用逻辑索引筛选所有符合条件的离群值 outliers <- x[x < lower_bound | x > upper_bound] # 无离群值时返回integer(0),否则返回筛选结果 if (length(outliers) == 0) { integer(0) } else { outliers } }
测试验证
执行你预期的调用,就能得到想要的结果:
- 调用
my_outlier(c(1:10, 20, 100, 120), th=1.5),输出:[1] 20 100 120 - 调用
my_outlier(c(1:10, 20, 100, 120), th=5),输出:[1] 100 120 - 调用
my_outlier(c(1:10), th=1.5),输出:integer(0)
修改说明
- 用逻辑索引替代原有的
if判断:x[x < lower_bound | x > upper_bound]能直接筛选向量中所有符合离群值条件的元素,这是R处理向量批量判断的标准写法。 - 去掉了原代码中错误的
list(x),直接返回筛选后的向量,符合预期的输出格式。 - 增加了对筛选结果长度的判断,确保无离群值时返回
integer(0),和预期一致。
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

