2012-02-27 83 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