使用R将data.frame中超出5%/95%分位数的离群值替换为NA
R实现分位数法替换离群值为NA
核心逻辑
- 仅处理数据框中的数值型列,非数值列(如示例中的站点标识列
st)不做修改 - 对每个数值列计算5%分位数和95%分位数,计算时默认跳过原始数据中的空值避免报错
- 满足小于5%分位数或大于95%分位数的数值判定为离群值,替换为NA
补充说明:如果需要调整分位数的计算逻辑,可以修改
quantile()函数的type参数,取值范围1-9,不同参数对应不同行业常用的分位数计算规则,默认type=7为R通用标准。
基础R实现代码
# 加载示例数据 df=read.table(text="st PH OD COD N A 7.3 1.26301094 1.112359589 0.295842925 B 12.69875867 5.670646078 4.841748321 0.096958426 C 9.613564343 1.706277385 7.952266541 0.102672152 D 9.693461149 7.075560183 0.283503075 0.302494648 A 11.2031501 5.444756127 3.133271063 0.421172108 B 9.288552402 4.169068095 10.54049312 0.122900615 C 4.207333379 6.717653051 10.49073885 0.085634135 D 10.98593946 2.352068972 8.468436777 0.142284793 A 8.20679887 7.826764274 4.464242367 0.211200956 B 12.9165421 0.909886436 1.488358471 0.001640961 C 3.971088246 8.500668307 6.315208679 0.319835127 D 4.821068685 3.871082236 8.669284239 0.349317325 A 0.431563127 0.978922921 10.53756208 0.111929377 B 7.546887828 9.946840115 1.584013576 0.426681716 C 4.689617182 8.717656795 7.474709944 0.473463497 D 9.730568456 1.134763618 4.679810195 0.215744107 A 12.06381259 6.862549062 0.559497593 0.231984105 ", sep = "", header = TRUE) # 离群值替换处理 df_processed <- df for (col in names(df_processed)) { # 跳过非数值列 if (!is.numeric(df_processed[[col]])) next q5 <- quantile(df_processed[[col]], 0.05, na.rm = TRUE) q95 <- quantile(df_processed[[col]], 0.95, na.rm = TRUE) # 替换离群值为NA df_processed[[col]][df_processed[[col]] < q5 | df_processed[[col]] > q95] <- NA }
tidyverse(dplyr)实现代码
适合习惯tidyverse生态的用户使用,写法更简洁:
library(dplyr) df_processed <- df %>% mutate(across(where(is.numeric), ~{ q5 <- quantile(.x, 0.05, na.rm = TRUE) q95 <- quantile(.x, 0.95, na.rm = TRUE) ifelse(.x < q5 | .x > q95, NA, .x) }))
结果验证
执行完成后可以通过head(df_processed)或者summary(df_processed)查看替换结果,示例数据中PH列的0.43、12.92,N列的0.0016等离群值都会被替换为NA。
内容的提问来源于stack exchange,提问作者wesleysc352
相关产品推荐
相关产品推荐

