2015-05-23 3 views
0

У меня есть вектор, который я пытаюсь заменить значениями в использовании if/else. Он заменяет все значения, кроме NA. Может кто-нибудь сказать мне, почему?NA в списке считается числовым. Как преобразовать в объект NA?

Мое подозрение в том, что NA обрабатываются как числа (на основе проверки класса значения списка NA, который возвращает числовую), но если они обрабатываются таким образом, как я могу получить R, чтобы увидеть их как объекты NA, так выполняется мое заявление if?

> V(g)$label 
    [1] 13 9 17 34 8 15 0 10 19 21 9 12 23 12 19 25 12 23 20 13 35 1 3 0 0 34 42 10 26 24 17 21 14 0 0 5 8 25 1 38 21 7 28 1 7 5 2 0 33 9 0 3 24 8 28 31 1 4 12 42 18 14 22 44 7 20 17 25 16 20 15 
[72] 8 13 45 8 32 13 25 15 33 15 13 52 37 2 4 27 41 12 33 26 4 0 7 37 43 24 23 22 9 3 7 8 13 20 0 0 0 9 10 1 2 18 16 0 0 8 11 0 0 0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
> class(V(g)$label[130]) 
[1] "numeric" 
> V(g)$label[130] 
[1] NA 

########converts values 

V(g)$label <- ifelse(as.numeric(V(g)$label) < 10, 1, 
       ifelse(as.numeric(V(g)$label) >= 30, 3, 
       ifelse(is.na(V(g)$label),999,2))) 
> V(g)$label 
    [1] 2 1 2 3 1 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 3 1 1 1 1 3 3 2 2 2 2 2 2 1 1 1 1 2 1 3 2 1 2 1 1 1 1 1 3 1 1 1 2 1 2 3 1 1 2 3 2 2 2 3 1 2 2 2 2 2 2 
[72] 1 2 3 1 3 2 2 2 3 2 2 3 3 1 1 2 3 2 3 2 1 1 1 3 3 2 2 2 1 1 1 1 2 2 1 1 1 1 2 1 1 2 2 1 1 1 2 1 1 1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
+0

Не могли бы вы добавить результат 'dput (V (g) $ label)', а также добавить желаемый результат. Я подозреваю, что есть лучший способ достичь желаемого результата. Значения NA классифицируются как числовые, поскольку они начинаются с числового вектора. На самом деле они не рассматриваются как числа. –

+0

Вы также можете сначала изменить значения NA, используя знак 'is.na (V (g) $) <- 999', и все будет, вероятно, более плавным. –

+0

Вместо использования нескольких' ifelse' вы можете рассмотреть 'cut' с соответствующими 'breaks', а затем заменить NA на последнем шаге. – Henrik

ответ

1

Прежде всего, необходимо проверить на наличие NA. Это должно работать:

V(g)$label <- ifelse(is.na(V(g)$label), 999, 
        ifelse(as.numeric(V(g)$label) < 10, 1, 
        ifelse(as.numeric(V(g)$label) >= 30, 3, 2))) 
+0

Итак, если else проверяет первое значение, находит условие, в котором оно подходит, то проверяет следующее значение? Положите, что код выглядит так, что он будет проверять каждое условие последовательно – Rilcon42

+0

@ Rilcon42, да, условия оцениваются последовательно, начиная с внешнего 'ifelse' по отношению к внутренним операторам ifelse. –

0

Переводчик не собирается продолжать проверять другие условия, когда первое условие (ли значение меньше 10) принимает значение NA, потому что NA не то же самое, как FALSE. Если вы каким-то образом прочь проверки NA как первое условие, вы можете добавить его в украдкой, чтобы сделать ваш компьютер делать больше работы:

V(g)$label <- 
    ifelse(V(g)$label < 10 & is.na(V(g)$label)==FALSE, 1, 
     ifelse(V(g)$label >= 30 & is.na(V(g)$label)==FALSE, 3, 
      ifelse(is.na(V(g)$label),999,2))) 

Но я не знаю, почему бы хотел, чтобы проверить то же условие три раз.

Смежные вопросы