[英]delete outliers from all columns of a dataframe in r
我正在嘗試使用 iqr 從我的數據集中刪除異常值。 我得到了 dataframe 中每一列的 iqr 值,現在我想從 dataframe 中排除所有異常值。 我的代碼是:
> q1 <- colwise(quantile)(completeData, probs = c(.25))
> q2 <- colwise(quantile)(completeData, probs = c(.75))
> IQR <- q2 - q1
> IQR
MinTemp MaxTemp Rainfall Evaporation Sunshine WindGustSpeed WindSpeed9am WindSpeed3pm Humidity9am Humidity3pm Pressure9am Pressure3pm Cloud9am Cloud3pm Temp9am Temp3pm RainToday Date Location
1 9.2 10.3 2.2 4.4 7.1 19 8 11 26 31 9.6 9.7 5 4 9.3 9.9 1 1537 25
WindGustDir WindDir3pm RainTomorrow
1 9 8 1
現在我在 dataframe 中的每個變量都有 iqr 值,我想以這種方式排除異常值:
completeData <- subset(completeData, completeDat > (q1 - 1.5*IQR) & completeData < (q2+1.5*IQR))
最后一行只是為了讓您理解這個想法。 最后一行的代碼不起作用,我只想要一些可以幫助我從數據框的每一列中刪除所有異常值的東西。
提前感謝誰會幫助我。
而不是從數據集中刪除異常值,我建議將它們轉換為NA
,因為您可以在每列中擁有可變數量的異常值,這將為您提供不同數量的值。
completeData <- lapply(completeData, function(x) {
q1 <- quantile(x, .25)
q2 <- quantile(x, .75)
IQR <- q2 - q1
replace(x, x < (q1 - 1.5*IQR) | x > (q2+1.5*IQR), NA)
})
要刪除異常值,請嘗試以下操作。
它定義了一個colwise
以逐列應用,並使用結果對數據進行子集化。
library(plyr)
outl <- function(x, na.rm = FALSE){
qq <- quantile(x, probs = c(0.25, 0.75), na.rm = na.rm)
iqr <- diff(qq)
x > qq[1] - 1.5*iqr & x < qq[2] + 1.5*iqr
}
which_out <- colwise(outl)(completeData)
這是刪除具有至少一個異常值的行。
subset(completeData, rowSums(which_out) == ncol(which_out))
這是為了保留至少有一個異常值的行。 用下面的數據測試。
subset(completeData, rowSums(which_out) < ncol(which_out))
# Sepal.Length Sepal.Width Petal.Length Petal.Width
#16 5.7 4.4 1.5 0.4
#33 5.2 4.1 1.5 0.1
#34 5.5 4.2 1.4 0.2
#61 5.0 2.0 3.5 1.0
測試數據
data(iris, package = "datasets")
completeData <- iris[-5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.