2012-05-13 3 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 потрясающий (IMHO) для поиска функций, которые вы хотите делать.

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 
} 
Смежные вопросы