在R中用NA替换值

时间:2013-03-25 22:38:50

标签: r sum na

我有一个看起来像的字符向量:

"Internet" "Internet" "-1"       "-5"       "Internet" "Internet" 

我想替换所有负数值(-1,-5等)的值 与NA

我用这段代码做到了:

hintsData$WhereSeekHealthInfo[hintsData$WhereSeekHealthInfo < 0] <- NA

这似乎有效:

head(hintsData$WhereSeekHealthInfo)
# [1] "Internet" "Internet" NA         NA         "Internet" "Internet"

但是当我做的时候

> sum(hintsData$WhereSeekHealthInfo == "Internet")
# [1] NA

基本上我不能再将这些值相加,因为我以某种方式改变了矢量?

在运行NA代码之前,我能够运行代码并获得此代码:

> sum(hintsData$WhereSeekHealthInfo == "Internet")
# [1] 1691

那么,如何用NA替换“-1”,“ - 5”等值,但仍然得到:

> sum(hintsData$WhereSeekHealthInfo == "Internet")
# [1] 1691

如果您有任何想法,请告诉我。我确实找到了关于用NA替换的其他问题但我不知道为什么一旦我用NA替换我就不能再计算值了我不知道要搜索什么或排除。

2 个答案:

答案 0 :(得分:5)

sum有一个na.rm参数,设置为TRUE,您将删除NA。 (通常,1+NA = NA,因此您要删除NA值)

话虽如此,鉴于您的向量是字符(在这种情况下它确实起作用,但我不想假设它是健壮的),您对<0条件略微偷偷摸摸地说。

NA中设置R值的惯用方法是使用is.na<-,例如

is.na(hintsData$WhereSeekHealthInfo) <- hintsData$WhereSeekHealthInfo <0

根据您的数据读取方式,您可以将其设置为处理您的信息

例如,如果您在阅读文本文件之前知道有效的回复,则可以创建自己的类

 setAs("character","Q1", function(from) factor(from ,levels = c('Internet','Newspaper'))

 read.csv('mytextfile.csv', colClasses = list(WhereSeekHealthInfo = 'Q1')

或者(更明确地看待NA值,而不是明确有效值是什么。

  setAs("character","Q1b", function(from) {is.na(from) <- suppressWarnings(as.numeric(from)) <0;from})

答案 1 :(得分:0)

原因是x == NANA的任何值都返回x(即使x本身就是NA)。

所以你应该使用Arun的建议sum(..., na.rm=TRUE)