列表中的NA被认为是数字。如何转换为NA对象?

时间:2015-05-23 22:05:03

标签: r

我有一个向量,我试图用if / else替换值。它替换除NA之外的所有值。有人可以告诉我为什么吗?

我怀疑是NA被视为数字(基于检查返回数字的NA列表值的类)但是如果他们正在这样对待我怎样才能让R看到它们作为NA对象所以我的如果声明有效吗?

> 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

2 个答案:

答案 0 :(得分: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)))

答案 1 :(得分:0)

一旦第一个条件(值是否小于10)评估为NA,解释器就不会继续检查其他条件,因为NAFALSE不同}。如果你以某种方式反对检查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)))

但我不知道为什么会三次检查相同的情况。