2013-06-18 62 views
0

我有一個數據集,其中一列包含條目yes,noNA。我想用1替換任何NA,並用0替換任何非NA條目。 Ifelse0代替非NA條目,但不代替1NA條目。我需要使用is.na()命令。爲什麼is.na()ifelse不工作?爲什麼Ifelse無法取代NAs?

我在下面定義了一個可重複的例子,它以定義爲一個因子的列開始,因爲這就是我得到數據的方式。

q <-as.factor(c(NA, "yes", "no", "yes", NA)) 

    ## Does not work 
    q <- ifelse(q == "NA", 1, 0) 
q  
### Returns: [1] NA 0 0 0 NA 

    ## Does not work 
    q[q == "NA"] <- 1 
q  
### Returns: [1] NA 0 0 0 NA  

    ## This works 
    q[is.na(q)] <- 1 
q 
### Returns: [1] 1 0 0 0 1 

其他一些條目存在,但他們似乎沒有這個確切的問題。 https://stackoverflow.com/a/8166616/1364839 - 此答案顯示is.na()有效,但不是爲什麼ifelse失敗。

+3

'ifelse'沒有問題。你正在做兩個完全不同的邏輯比較。字符串「NA」與「NA」無關。 – joran

+0

閱讀'?base :: Logic'和'?NA'。 –

+0

如何在ifelse中直接引用'NA'? –

回答

3

你真的不需要ifelse()在這裏,尤其是因爲如果你不知道什麼東西的價值(這是什麼NA表示!)你怎麼能比較它的價值與其他東西?

> NA == NA ## yes, even NA can't be compared with itself 
[1] NA 

相反,使用is.na()識別的東西是否是NA與否。 is.na()返回TRUE如果元素是NAFALSE否則。然後我們可以使用FALSE == 0TRUE == 1當我們強制爲數字的事實:

q <-as.factor(c(NA, "yes", "no", "yes", NA)) 
q 

as.numeric(is.na(q)) 

> as.numeric(is.na(q)) 
[1] 1 0 0 0 1 

如果是太多了打字然後通過同樣的伎倆

> is.na(q) + 0 
[1] 1 0 0 0 1 

作品除了+是做強迫你。

+0

非常感謝!另外,上面的@ SimonO101指出了'ifelse(is.na(q),1,0)'作爲另一種方法。 –

+1

@DTRM不是真的,如果你看看'ifelse'的膽量,你會發現它對於像這樣的東西是過度的。更普遍有用的可能是,但不涉及你的問題。 –

相關問題