【问题标题】:How to create a binary variable from a loop and an if statement如何从循环和 if 语句创建二进制变量
【发布时间】:2013-03-22 06:02:35
【问题描述】:

假设我有一个向量 x 包含 20 个介于 0 和 2 之间的值。

x = runif(20, 0, 2)

现在,我想在以下条件下创建另一个向量 y(二进制变量),其中仅包含 0 和 1:y = 0 如果 x < 1y = 1 如果 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
  }
}

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

【问题讨论】:

    标签: r if-statement for-loop


    【解决方案1】:

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

    > 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
    

    更通用的解决方案是使用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
    

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

    > 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
    

    【讨论】:

    • 哇!我更喜欢R!!!非常感谢@NPE。但是,如果我想分配 0 和 1 以外的值,我该怎么办?
    • @SavedByJESUS:你可以使用ifelse,例如ifelse(x &gt; 1, 5, -5)
    • @NPE -- 或者,为了好玩,这个:c(-5, 5)[(x&gt;1) + 1]
    • @SavedByJESUS: ifelse(x &lt; 2./3, 0, ifelse(x &lt; 4./3, 1, 2)).
    • @SavedByJESUS -- 要查看发生了什么,请尝试FALSE + 1; TRUE + 1; c(-5,5)[c(1,2,2,2,1)]。 (肯定有点混淆,但这个想法可能很有用。)
    猜你喜欢
    • 2021-04-30
    • 2019-12-03
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多