условия if-else дают странные результаты - PullRequest
1 голос
/ 13 марта 2019

Я выполняю этот фрагмент кода в 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

По сути, я пытаюсь назначить значение для "y" на основе значения в каждом индексе "sample".данные".

Моя логика кажется правильной, но результат не тот, который я ожидал:

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

4 голосов
/ 13 марта 2019

Это потому, что ваш 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 голос
/ 13 марта 2019

Ваш пример данных вектора имеет размер 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...