R语言如何实现离群值二值化标记,覆盖按变量/按行两类场景
构造基础数据与复用现有函数
首先我们直接复用你已经实现的3倍IQR离群值检测函数,先完成示例数据的构造:
# 构造示例数据框 df <- data.frame( Var1 = c(0.11, 0.12, 0.13, 0.14, 8.99, 0.11), Var2 = c(11, 12, 13, 14, 15, 999) ) # 你已实现的离群值检测函数 is_outlier <- function(df, na.rm = FALSE) { qs = quantile(df, probs = c(0.25, 0.75), na.rm = na.rm) lowerq <- qs[1] upperq <- qs[2] iqr = upperq - lowerq extreme.threshold.upper = (iqr * 3) + upperq extreme.threshold.lower = lowerq - (iqr * 3) # Return logical vector df > extreme.threshold.upper | df < extreme.threshold.lower }
需求1:各变量独立生成离群值二值列
分别对每个变量做离群值判定,逻辑值转整数(TRUE对应1、FALSE对应0)即可,两种实现方式可选:
dplyr实现(语法简洁)
library(dplyr) df_result1 <- df %>% mutate(across(c(Var1, Var2), ~as.integer(is_outlier(.)), .names = "Out{.col}"))
原生R实现(无需加载额外包)
df_result1 <- df df_result1$OutVar1 <- as.integer(is_outlier(df$Var1)) df_result1$OutVar2 <- as.integer(is_outlier(df$Var2))
输出结果完全符合要求:
Var1 Var2 OutVar1 OutVar2 1 0.11 11 0 0 2 0.12 12 0 0 3 0.13 13 0 0 4 0.14 14 0 0 5 8.99 15 1 0 6 0.11 999 0 1
需求2:按行判定生成单一离群值标记列
先对所有目标列做离群值判定,再按行判断是否存在至少1个离群值即可:
dplyr实现
df_result2 <- df %>% mutate(OutRow = as.integer(rowSums(across(c(Var1, Var2), ~is_outlier(.))) > 0))
原生R实现
df_result2 <- df outlier_mat <- sapply(df[c("Var1", "Var2")], is_outlier) df_result2$OutRow <- as.integer(rowSums(outlier_mat) > 0)
输出结果如下:
Var1 Var2 OutRow 1 0.11 11 0 2 0.12 12 0 3 0.13 13 0 4 0.14 14 0 5 8.99 15 1 6 0.11 999 1
内容的提问来源于stack exchange,提问作者Werrby
相关产品推荐
相关产品推荐

