2012-05-13 82 views
2

我已經查看了一組數據,並決定刪除異常值將會很好,異常值的定義是距離均值2SD。刪除R中的異常值

如果我有一組數據,說500行,有15個不同的屬性,我怎樣才能刪除所有具有1個或多個屬性的行,這些屬性是距標準差2個標準偏差?

有沒有一種簡單的方法來使用R做到這一點? 謝謝,

+2

如果你做一個StackOverflow的搜索'[R]刪除outlier'你會得到許多外用前面的問題,如:http://stackoverflow.com/q/1444306/602276或http:// stackoverflow.com/questions/4787332/how-to-remove-outliers-from-a-dataset – Andrie

回答

3

可能有很多方法,並可能添加包來處理這個問題。我建議你先試試這個:

library(sos); findFn("outlier") 

這裏有一個方法,你可以做你的要求使用scale功能,可以標準化的載體。

#create a data set with outliers 
set.seed(10) 
dat <- data.frame(sapply(seq_len(5), function(i) 
    sample(c(1:50, 100:101), 200, replace=TRUE))) 

#standardize each column (we use it in the outdet function) 
scale(dat) 

#create function that looks for values > +/- 2 sd from mean 
outdet <- function(x) abs(scale(x)) >= 2 
#index with the function to remove those values 
dat[!apply(sapply(dat, outdet), 1, any), ] 

因此,在回答你的問題是存在這樣一個簡單的方法的代碼要做到這一點,可以歸結爲1行代碼:

dat[!apply(sapply(dat, function(x) abs(scale(x)) >= 2), 1, any), ] 

而且我猜有一個包這可能會做到這一點和更多。 sos包很棒(恕我直言)尋找功能做你想做的。

2
na.rm = TRUE, ...) { 
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...) 
H <- 1.5 * IQR(x, na.rm = na.rm) 
y <- x 
y[x < (qnt[1] - H)] <- NA 
y[x > (qnt[2] + H)] <- NA 
y 
}