You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 22:39:02