我想将5%的优质数据更改为异常值。因此,在这种情况下,n = 40,这意味着我需要将2个y值更改为异常值。但是我不知道如何让一个更多的条件让R知道我只想改变2个y值,而不是所有小于或等于2的值。以下是我尝试过的R代码:
set.seed(1001)
x1 <- runif(40,1,10)
y1 <- 5 + x1
x <- 2
for (i in 1:length(x1)){
if (x1[i] <= x){
y1[i] <- rnorm(1,20,1)
}
}
答案 0 :(得分:0)
您可能希望随机选择异常值。
set.seed(1001)
x1 <- runif(40,1,10)
y1 <- 5 + x1
change_idx <- sample(1:40, 2, replace = FALSE)
y1[change_idx] <- rnorm(2, 20, 1)
行y1[change_idx]
使用向量化,因此不需要循环。
为了更容易重用它或更改变量,您可以将一些变量用于代码中使用的值:
n <- 40
o <- 2
x1 <- runif(n,1,10)
y1 <- 5 + x1
change_idx <- sample(1:n, o, replace = FALSE)
y1[change_idx] <- rnorm(o, 20, 1)
您现在可以将数据可视化并标记异常值:
group <- rep("normal", n)
group[change_idx] <- "outlier"
ggplot(data.frame(x1, y1, group)) + geom_point(aes(x1, y1, col = group))
根据您要实现的目标,我建议在y1
变量中添加一些噪音,例如y1 <- 5 + x1 + rnorm(n, 0, 1)
,这将产生如下数据: