如何从循环和if语句创建二进制变量

Sav*_*SUS 4 for-loop if-statement r

假设我有一个x包含0到2之间的20个值的向量.

x = runif(20, 0, 2)
Run Code Online (Sandbox Code Playgroud)

现在,我想y在以下条件下创建另一个仅包含0和1的向量(二进制变量):y = 0if x < 1y = 1in case x > 1.

我尝试用循环和if语句以下列方式执行此操作:

x = runif(20, 0, 2) # Create a vector of 20 values between 0 and 2
y = rep(5, 20) # Create a vector of 20 values (only 5's)

for(i in 1:length(x)) # Loop that assigns values to the y vector depending on x
{
  if(x < 1)
  {
    y[i] = 0
  }
  else
  {
    y[i] = 1
  }
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它没有按计划工作,因为我的y矢量最终仅包含0.我做错了什么?谢谢 :)

NPE*_*NPE 5

这可以使用矢量化操作而不是循环来完成:

> x <- runif(20, 0, 2)
> y <- as.integer(x > 1)
> x
 [1] 0.06553935 1.23221386 0.39982502 0.27821193 1.15281280 0.14248373 0.09206153 1.63555223 0.44962775 0.70711450
[11] 0.93994130 1.41955732 1.95790383 0.99646643 1.38737559 1.75813075 1.32844540 0.53076589 0.96152349 1.31173062
> y
 [1] 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1
Run Code Online (Sandbox Code Playgroud)

更通用的解决方案是使用ifelse它,因为它允许您使用除零和一之外的值:

> ifelse(x <= 1, -5, 5)
 [1] -5  5 -5 -5  5 -5 -5  5 -5 -5 -5  5  5 -5  5  5  5 -5 -5  5
Run Code Online (Sandbox Code Playgroud)

最后,值得注意的是,您可以使用两种方法中的任何一种来使用更复杂的表达式:

> ifelse(x >= .5 & x <= 1.5, -5, 5)
 [1]  5 -5  5  5 -5  5  5  5  5 -5 -5 -5  5 -5 -5  5 -5 -5 -5 -5
Run Code Online (Sandbox Code Playgroud)