在条件中仅替换特定百分比的值

时间:2018-01-25 08:16:57

标签: r

我想将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)

  } 
}

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))

enter image description here

根据您要实现的目标,我建议在y1变量中添加一些噪音,例如y1 <- 5 + x1 + rnorm(n, 0, 1),这将产生如下数据:enter image description here