2015-01-30 4 views
1

У меня есть большие данные с 12 collumns и 600000 строк, и я хочу, чтобы заменить выбросы с помощью этой функцииЗаменить выбросы из больших данных

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

но для цикла он собирается занять много времени, могу я сделать это быстрее без лучшего оборудования или кластера?

+1

данных. таблица. –

ответ

2

Существует несколько способов оптимизации функции, но по мере того, как ваш вопрос стоит, операция не такая медленная.

Во всяком случае, не прибегая к data.table, dplyr или параллельному программированию, мы все еще можем получить небольшое увеличение скорости, просто переписав свою функцию

replace_outliers2 = function(x, na.rm = TRUE, ...) { 
    qnt = quantile(x, probs=c(.25,.50 ,.75), na.rm = na.rm, ...) 
    x[x > (2.5*qnt[3]- 1.5*qnt[1])] = qnt[2] 
    x 
} 

Некоторых быстрых тайминги:

R> x = matrix(rlnorm(600000*12), ncol=12) 
R> system.time({for(i in 1:12) replace_outliers(x[,i])}) 
    user system elapsed 
    1.448 0.008 1.469 
R> system.time({ for(i in 1:12) replace_outliers2(x[,i])}) 
    user system elapsed 
    0.860 0.004 0.869 
+0

Спасибо, отлично работает –

Смежные вопросы