将异常值插入数据帧

时间:2016-05-30 16:52:43

标签: r outliers

我尝试创建一个函数,将异常值注入现有数据框。

我开始使用原始数据框的outsmax值创建新的数据框min。此outs数据框将包含某些amount的优先数据。 后来我想将outs数据帧的优先值注入原始数据帧。

我想要的是向原始数据帧注入一定数量的异常值的函数。 我有不同的问题,例如:我知道我是否使用正确的runif来创建异常值的数据帧,然后我不知道如何将异常值注入temp

我到目前为止尝试过的代码是:

addOutlier <- function (data, amount){
maxi <- apply(data, 2, function(x) (mean(x)+(3*(sd(x)))))
mini <- apply(data, 2, function(x) (mean(x)-(3*(sd(x)))))
temp <- data
amount2 <- ifelse(amount<1, (prod(dim(data))*amount), amount)
outs <- runif(amount2, 2, min = mini, max = maxi) # outliers
if (amount2 >= prod(dim(data))) stop("exceeded data size")
 for (i in 1:length(outs))
   temp[sample.int(nrow(temp), 1), sample.int(ncol(temp), 1)] <- outs
 return (temp)
} 

请任何帮助使这项工作,将深表感谢

1 个答案:

答案 0 :(得分:1)

我的理解是,您要实现的是向量中的每列添加一定量的异常值。或者,您似乎也在考虑为每列添加%的异常值。我只为前一种情况写下了一个解决方案,但如果真的需要,后者应该很容易实现。请注意我如何将事情分解为两个功能,以(希望)帮助澄清正在发生的事情。希望这有帮助!

add.outlier.to.vector <- function(vector, amount) {
  cells.to.modify <- sample(1:length(vector), amount, replace=F)
  mean.val <- mean(vector)
  sd.val <- sd(vector)
  min.val <- mean.val - 3 * sd.val
  max.val <- mean.val + 3 * sd.val 
  vector[cells.to.modify] <- runif(amount, min=min.val, max=max.val)
  return(vector)
}
add.outlier.to.data.frame <- function (temp, amount){
  for (i in 1:ncol(temp)) {
    temp[,i] <- add.outlier.to.vector(temp[,i], amount)
  }
  return (temp)
} 

data <- data.frame(
  a=c(1,2,3,4),
  b=c(7,8,9,10)
)
add.outlier.to.data.frame(data, 2)