【问题标题】:Inserting outliers to a dataframe将异常值插入数据框
【发布时间】:2016-05-30 16:52:42
【问题描述】:

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

我开始使用原始数据框的maxmin值创建一个新的数据框outs。这个outs 数据框将包含某个amountof 异常数据。 稍后我想将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)
} 

请任何帮助完成这项工作,将不胜感激

【问题讨论】:

  • 我不确定我是否理解您的目标,但我认为您的代码中存在错误。 runif(n, mini, maxi) 将为您提供介于您定义的两个极端之间的 n 值。它不太可能是异常值,当然也不能保证是异常值。
  • @Alex 我看到了问题,任何关于我如何保证有异常值的建议
  • 您还没有明确定义“异常值”是什么意思......显然runif(n, -Inf, mini)runif(n,maxi, Inf) 会起作用,但这可能不现实。
  • 不!你绝对不应该抓住别人的答案并声称它是你自己的而不署名......你的编辑也没有解决我提出的问题。

标签: r outliers


【解决方案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)

【讨论】:

  • 有用的功能,但是有没有办法可以保持数据集的原始平均值,所以我可以看到注入的异常值
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2010-09-19
  • 2016-11-16
  • 2011-05-05
相关资源
最近更新 更多