Функция для удаления выбросов из DataFrame

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

Для примера ввода 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
 .     .     .       .       .
 .     .     .       .       .

person Rick Arko    schedule 02.03.2016    source источник
comment
stackoverflow.com/questions/12866189/ Это может и вам пригодится. Идея заключается в том, что вы создаете функцию, которая принимает фрейм данных, суммирует фрейм данных, находя квантили, верхние и нижние пороги и фильтруя окончательный набор данных за пределами этого диапазона.   -  person InfiniteFlash    schedule 08.03.2016


Ответы (1)


Ваша проблема в том, что вы пытаетесь сделать каждый столбец фреймом данных при назначении его списку. Это не нужно. Мы также можем избежать рабочего процесса инициализации списка и привязки, просто перезаписывая столбцы в объекте 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)))
}
person Gregor Thomas    schedule 02.03.2016
comment
Это именно то, что я искал. Спасибо! - person Rick Arko; 03.03.2016