2

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

"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 我就不能再计算值了,我不确定要搜索或排除什么。

4

2 回答 2

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})
于 2013-03-25T22:48:55.357 回答
0

这样做的原因是 x == NA返回NA任何值x(即使x是它本身NA)。

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

于 2013-03-25T22:48:19.247 回答