我尝试创建一个函数,将异常值注入现有数据框。
我开始使用原始数据框的outs
和max
值创建新的数据框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)
}
请任何帮助使这项工作,将深表感谢
答案 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)