【问题标题】:if-else conditions produce odd resultsif-else 条件产生奇怪的结果
【发布时间】:2019-03-13 02:46:09
【问题描述】:

我在 R 中运行这段代码:

set.seed(4997)
n =50
data1 <- runif(n, min = 0, max = 1)
data2 <- runif(n, min = 2, max = 5)
sample.data <- c(data1,data2)
sample.data
y <- numeric(2*n)
  for(i in 1:n){
    if((sample.data[i] < 1)) {y[i] <- -1
    } else if ((sample.data[i] > 1))  {y[i] <- 1}}
y

基本上,我要做的是根据“sample.data”的每个索引处的值为“y”分配一个值。

我的逻辑似乎是合法的,但输出不是我所期望的:

> y
  [1] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 [29] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0  0  0  0  0  0
 [57]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 [85]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

我什至不知道零是怎么来的。

任何提示都会很棒!谢谢!

【问题讨论】:

  • 你的循环从 1:n 开始,其中 n = 50。你的向量 y 是 2 * n = 100。所以只有前 50 个值被分配。前 50 个都是 -1,因为 data1 总是

标签: r


【解决方案1】:

那是因为你的 n 是 50,而 length(sample.data) 是 100。所以当你从 1:n 循环时,它只对前 50 个值进行迭代,并保持其余 50 个值不变(即 0)。

你需要的是

for(i in 1:length(sample.data)) {
     if(sample.data[i] < 1) 
          y[i] <- -1
     else if (sample.data[i] > 1)  
          y[i] <- 1
}

但是,您可以通过使用矢量化的ifelse 来避免for 循环,并将上述代码简化为

ifelse(sample.data < 1, -1, 1)

【讨论】:

    【解决方案2】:

    您的矢量样本数据大小为 2*n,因此您的 for 循环应该是

    for(i in 1: (2*n)){
        if((sample.data[i] < 1))
         {y[i] <- -1
    } else if ((sample.data[i] > 1)){
        y[i] <- 1}
    }
    
    > y
    [1] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    [25] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
    [49] -1 -1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
    [73]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
    [97]  1  1  1  1
    

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多