2012-02-27 85 views
4

我有一個數據幀,其中包含多個因子列,其中包含NaN,我想將其轉換爲NA's(NaN似乎是使用線性迴歸對象預測on新數據)。R無法將NaN轉換爲NA

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN) 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 
> tester1[is.nan(tester1)] = NA 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 
> tester1[is.nan(tester1)] = "NA" 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 
+0

你可能想看看'setattr'從data.table包中查看MatthewDowle對我今天早些時候的問題的回答:http://stackoverflow.com/questions/9463980/how-to-assign-within-apply-family – 2012-02-27 22:24:17

+0

這個例子沒有任何意義:你如何建議使用charact呃線性迴歸數據? – 2012-02-27 23:00:38

+0

這是一個因素。最後我檢查了lm()可以處理w /因素。我應該在這個例子中拋出一個因素()。 – screechOwl 2012-02-27 23:12:14

回答

12

這裏的問題:你的載體是模式字符,所以當然這「不是一個數字」。最後一個元素被解釋爲字符串「NaN」。如果向量是數字,則只有使用is.nan纔有意義。如果你想在一個字符向量中創建一個值(這樣它就可以通過迴歸函數正確處理),然後使用(不帶任何引號),NA_character_

> tester1 <- c("2", "2", "3", "4", "2", "3", NA_character_) 
> tester1 
[1] "2" "2" "3" "4" "2" "3" NA 
> is.na(tester1) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE 

在字符向量中,「NA」和「NaN」都不是真的丟失。如果由於某種原因,有在爲「南」,那麼你就已經能夠一個因素變量的值只使用邏輯索引:

tester1[tester1 == "NaN"] = "NA" 
# but that would not really be a missing value either 
# and it might screw up a factor variable anyway. 

tester1[tester1=="NaN"] <- "NA" 
Warning message: 
In `[<-.factor`(`*tmp*`, tester1 == "NaN", value = "NA") : 
invalid factor level, NAs generated 
########## 
tester1 <- factor(c("2", "2", "3", "4", "2", "3", NaN)) 

> tester1[tester1 =="NaN"] <- NA_character_ 
> tester1 
[1] 2 2 3 4 2 3 <NA> 
Levels: 2 3 4 NaN 

這最後的結果可能是驚人的。有一個剩餘的「NaN」級別,但沒有任何元素是「NaN」。相反,「NaN」元素現在是一個真正的缺失值,在print中表示爲。

4

編輯:

加文·辛普森在評論讓我想起,在你的情況,有更容易的方法來轉換什麼是真正的「南」到「NA」:

tester1 <- gsub("NaN", "NA", tester1) 
tester1 
# [1] "2" "2" "3" "4" "2" "3" "NA" 

解決方案:

爲了檢測該特徵向量的元素是NaN,您需要將向量轉換爲數值向量:

tester1[is.nan(as.numeric(tester1))] <- "NA" 
tester1 
[1] "2" "2" "3" "4" "2" "3" "NA" 

說明:

有幾個原因,這是不按照您的預期工作。

首先,儘管NaN代表「不是數字」,但它具有類"numeric",並且只在數字向量內有意義。

其次,當它被包含在一個字符向量中時,符號NaN被悄悄地轉換爲字符串"NaN"。當你再測試其nan -ness,字符串返回FALSE

class(NaN) 
# [1] "numeric" 
c("1", NaN) 
# [1] "1" "NaN" 
is.nan(c("1", NaN)) 
# [1] FALSE FALSE 
+0

???這是以非常迂迴的方式將字符串「NaN」轉換爲「NA」。當然,這不是OP想要的,即使他們在其中的一個例子中嘗試使用「NA」作爲「NA」。 – 2012-02-27 22:23:11

+0

@GavinSimpson - 好的。現在修復。感謝肩上的水龍頭,提醒我要把我的頭從野草中拔出來! – 2012-02-27 22:31:23

+0

我仍然認爲你正在反思OP的想法。他希望'NaN'轉換爲'NA'不是字符串版本,而是真正的R版本分別指示不是數字和缺失。忽略OP的一個例子中的「NA」 - 這是一個紅鯡魚,我認爲他們認爲引用NA可能在字符向量或類似的東西中用作「NA」。 – 2012-02-27 22:32:00

5

你不能有NaN的特徵向量,這是你必須在這裏:

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN) 
> is.nan(tester1) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 

公告[R是怎麼想的,這是一個字符串。

你可以在一個數字矢量創建NaN

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN) 
> as.numeric(tester1) 
[1] 2 2 3 4 2 3 NaN 
> is.nan(as.numeric(tester1)) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE 

然後,當然,R可以轉換NaNNA按您的代碼:

> foo <- as.numeric(tester1) 
> foo[is.nan(foo)] <- NA 
> foo 
[1] 2 2 3 4 2 3 NA