2016-03-02 4 views
0

Я хочу написать функцию, которая примет входной сигнал data.frame и возвращает новый data.frame, который заменил выбросы, используя функцию tsclean() из пакета прогноза.Функция для удаления Outliers из DataFrame

Для примера ввода df (содержащие очевидные выпадающие):

df <- data.frame(col1 = runif(24, 400, 700), 
       col2 = runif(24, 350, 600), 
       col3 = runif(24, 600, 940), 
       col4 = runif(24, 2000, 2600), 
       col5 = runif(24, 950, 1200)) 

colnames(df) <- c("2to2", "2to6", "17to9", "20to31", "90to90") 
df$`2to2`[[12]]=10000 
df$`17to9`[[20]]=6000 
df$`20to31`[[8]]=12000 

Я пытался решить эту проблему следующим образом

clean_ts <- function(df, frequency = 12, start = c(2014, 1), end = c(2015, 12)) { 

    ts <- ts(df, frequency = frequency, start = start, end = end) 
    results <- list() 

    for (i in 1:ncol(ts)) { 
    clean <- as.data.frame(tsclean(ts[,i])) 
    results[[i]] <- as.data.frame(cbind(clean)) 
    } 
    return(results) 
} 

Я знаю, что это неправильно. Вместо того, чтобы возвращать список, я хочу, чтобы моя функция возвращала data.frame с теми же размерами и именами столбцов, что и мой ввод data.frame. Я просто хочу, чтобы столбцы data.frame() были заменены в соответствии с функцией tsclean(). Так из примера мой выход будет иметь следующий вид:

2to2 2to6 17to9 20to31 90to90 
.  .  .  .  . 
.  .  .  .  . 
+1

http://stackoverflow.com/questions/12866189/calculating-the-outliers-in-r Это может для вас тоже будет полезен. Идея: вы создаете функцию, которая использует фреймворк данных, суммирует фрейм данных путем нахождения квантилей, верхнего и нижнего порогов и фильтрует окончательный набор данных за пределами этого диапазона. – InfiniteFlashChess

ответ

2

Ваша проблема заключается в том, что вы пытаетесь сделать каждый столбец кадр данных при назначении его в список. Это не нужно. Мы также можем избежать процесса инициализации-списка-и-cbind, просто перезаписывая столбцы в объекте df по одному за раз.

clean_ts <- function(df, frequency = 12, start = c(2014, 1), end = c(2015, 12)) { 

    ts <- ts(df, frequency = frequency, start = start, end = end) 

    for (i in 1:ncol(ts)) { 
    df[, i] <- tsclean(ts[, i]) 
    } 
    return(df) 
} 

Даже чище, мы можем использовать, чтобы скрыть lapply петлю:

clean_ts <- function(df, frequency = 12, start = c(2014, 1), end = c(2015, 12)) { 
    ts <- ts(df, frequency = frequency, start = start, end = end) 
    return(as.data.frame(lapply, ts, tsclean))) 
} 
+0

Это именно то, что я искал. Спасибо! –