我有一个向量,我试图用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
答案 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
,解释器就不会继续检查其他条件,因为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)))
但我不知道为什么会三次检查相同的情况。