用于从DataFrame中删除异常值的函数

时间:2016-03-02 21:52:30

标签: r for-loop dataframe outliers

我想编写一个以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
 .     .     .       .       .
 .     .     .       .       .

1 个答案:

答案 0 :(得分:2)

您的问题是,在将每个列分配到列表时,您尝试将每个列设为数据帧。这是不必要的。我们还可以通过一次覆盖 */1 * * * * /Users/tanavya.dimri/Documents/cron.sh 对象中的列来避免初始化到列表和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