如果其他条件产生奇怪的结果

时间:2019-03-13 02:46:10

标签: r

我正在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

我什至不知道零是如何到达的。

任何提示都很棒!谢谢!

2 个答案:

答案 0 :(得分:4)

那是因为您的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
}

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

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

答案 1 :(得分:1)

您的矢量样本数据的大小为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