我有一个看起来像的字符向量:
"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替换我就不能再计算值了我不知道要搜索什么或排除。
答案 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 == NA
对NA
的任何值都返回x
(即使x
本身就是NA
)。
所以你应该使用Arun的建议sum(..., na.rm=TRUE)