R新手技术求助:编写函数遍历数据列标记异常值
标记数据集中数值列异常值的R函数实现
我们采用**四分位距(IQR)**方法检测异常值(超出Q1 - 1.5*IQR或Q3 + 1.5*IQR范围的值判定为异常),以下是适配你数据集的完整代码:
1. 加载你的数据集
# 还原数据集 df <- structure(list(Time = c("10/24/2022 16:45", "10/24/2022 16:46", "10/24/2022 16:47", "10/24/2022 16:48", "10/24/2022 16:49", "10/24/2022 16:50", "10/24/2022 16:51", "10/24/2022 16:52", "10/24/2022 16:53", "10/24/2022 16:54", "10/24/2022 16:55", "10/24/2022 16:56", "10/24/2022 16:57", "10/24/2022 16:58", "10/24/2022 16:59", "10/24/2022 17:00", "10/24/2022 17:01", "10/24/2022 17:02", "10/24/2022 17:03"), Temperature.C. = c(32.2, 30, 31, 30, 30, 31, 32.2, 86, 30, 30, 30, 86, 30, 31, 31, 31, 3, 32.2, 30), Relative_Humidity = c(50, 49, 50, 50.5, 50, 49, 51, 50.5, 50, 120, 50, 50, 51, 51, 50, 49, 52, 49, 2)), class = "data.frame", row.names = c(NA, -19L ))
2. 编写异常值标记函数
mark_outliers <- function(data) { # 筛选数值型列 num_cols <- sapply(data, is.numeric) num_data <- data[, num_cols] # 遍历每一列,计算异常值标记 for (col in colnames(num_data)) { # 计算四分位数和IQR q1 <- quantile(num_data[[col]], 0.25, na.rm = TRUE) q3 <- quantile(num_data[[col]], 0.75, na.rm = TRUE) iqr_val <- q3 - q1 # 确定异常值上下限 lower_limit <- q1 - 1.5 * iqr_val upper_limit <- q3 + 1.5 * iqr_val # 生成标记列,标记为"Outlier"或"Normal" data[[paste0(col, "_Outlier")]] <- ifelse( num_data[[col]] < lower_limit | num_data[[col]] > upper_limit, "Outlier", "Normal" ) } return(data) }
3. 运行函数并查看结果
# 生成带标记的数据集 result_df <- mark_outliers(df) # 查看结果 print(result_df)
运行后会得到包含原数据和各数值列异常值标记的数据集,示例输出片段:
Time Temperature.C. Relative_Humidity Temperature.C._Outlier Relative_Humidity_Outlier1 10/24/2022 16:45 32.2 50.0 Normal Normal
8 10/24/2022 16:52 86.0 50.5 Outlier Normal
10 10/24/2022 16:54 30.0 120.0 Normal Outlier
额外建议
- 如果需要更可视化的异常值展示,可以结合
boxplot()函数查看每列的分布和异常点 - 若你的业务场景有特定的异常值判定规则,可以修改函数中的上下限计算逻辑
内容的提问来源于stack exchange,提问作者Notslayer205
相关产品推荐
相关产品推荐

