在R中实现循环对多列执行Tukey法识别异常值的求助
解决Tukey法批量生成异常值标识列的循环问题
嘿,我知道你卡在哪了——你之前的循环每次都把结果写到同一个固定列名里,每一轮都会覆盖上一轮的结果,最后自然只剩最后一列的标识啦。咱们只要给每个新生成的标识列加上原变量的名字,就能区分开每一列的异常值标记了!
正确的循环实现代码
这里我会用列名循环(比索引更直观),同时通过字符串拼接生成对应原变量的新列名:
# 先获取需要处理的4到41列的名称 target_cols <- colnames(mydata)[4:41] # 循环处理每一列 for (col_name in target_cols) { # 提取当前列的数据 current_data <- mydata[[col_name]] # 计算Tukey法需要的统计量 iqr_val <- IQR(current_data) q1 <- quantile(current_data)[[2]] # 25%分位数 q3 <- quantile(current_data)[[4]] # 75%分位数 # 拼接对应原列名的新标识列名 medium_low <- paste(col_name, "Medium_Outliers_low", sep = "_") medium_high <- paste(col_name, "Medium_Outliers_high", sep = "_") extreme_low <- paste(col_name, "Extremes_Outliers_low", sep = "_") extreme_high <- paste(col_name, "Extremes_Outliers_high", sep = "_") # 生成并添加异常值标识列 mydata[[medium_low]] <- ifelse(current_data < q1 - 1.5*iqr_val, 1, 0) mydata[[medium_high]] <- ifelse(current_data > q3 + 1.5*iqr_val, 1, 0) mydata[[extreme_low]] <- ifelse(current_data < q1 - 3*iqr_val, 1, 0) mydata[[extreme_high]] <- ifelse(current_data > q3 + 3*iqr_val, 1, 0) }
关键改进点说明
- 动态生成列名:用
paste()把原变量名和标识类型拼接,比如原列是age,就会生成age_Medium_Outliers_low这样的列,清晰对应原变量。 - 用
[[ ]]赋值:$符号只能识别固定的列名,而[[ ]]可以接收字符串变量,实现动态添加新列的需求,避免覆盖问题。 - 提取当前列数据:先把当前列数据存到临时变量里,代码更简洁易读。
这样运行后,你的数据集里就会为37列变量各生成4个对应的异常值标识列啦。
内容的提问来源于stack exchange,提问作者Bordes C
相关产品推荐
相关产品推荐

