我想替换我的相对较大的 R 数据集中的所有值,这些数据集的值分别高于第95个和第5个百分位数以及这些百分位数值。我的目标是避免完全从数据中删除这些异常值。
任何建议都会非常感激,我找不到任何其他地方如何做到这一点的信息。
答案 0 :(得分:13)
这样做。
fun <- function(x){
quantiles <- quantile( x, c(.05, .95 ) )
x[ x < quantiles[1] ] <- quantiles[1]
x[ x > quantiles[2] ] <- quantiles[2]
x
}
fun( yourdata )
答案 1 :(得分:6)
您可以使用squish()
在一行代码中执行此操作:
d2 <- squish(d, quantile(d, c(.05, .95)))
在比例库中,查看?squish
和?discard
#--------------------------------
library(scales)
pr <- .95
q <- quantile(d, c(1-pr, pr))
d2 <- squish(d, q)
#---------------------------------
# Note: depending on your needs, you may want to round off the quantile, ie:
q <- round(quantile(d, c(1-pr, pr)))
示例:
d <- 1:20
d
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
d2 <- squish(d, round(quantile(d, c(.05, .95))))
d2
# [1] 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 19
答案 2 :(得分:3)
我使用此代码来获取您需要的内容:
qn = quantile(df$value, c(0.05, 0.95), na.rm = TRUE)
df = within(df, { value = ifelse(value < qn[1], qn[1], value)
value = ifelse(value > qn[2], qn[2], value)})
其中df
是您的data.frame,value
是包含您数据的列。
答案 3 :(得分:0)
有一种更好的方法可以解决此问题。离群值不超过95%或低于5个百分点。相反,如果离群值在第一个四分位数以下-1.5·IQR或在第三个四分位数以上+ 1.5·IQR,则视为异常值。
该网站将更详尽地解释http://www.mathwords.com/o/outlier.htm
capOutlier <- function(x){
qnt <- quantile(x, probs=c(.25, .75), na.rm = T)
caps <- quantile(x, probs=c(.05, .95), na.rm = T)
H <- 1.5 * IQR(x, na.rm = T)
x[x < (qnt[1] - H)] <- caps[1]
x[x > (qnt[2] + H)] <- caps[2]
return(x)
}
df$colName=capOutlier(df$colName)
Do the above line over and over for all of the columns in your data frame