【问题标题】:replace values with NA in R在R中用NA替换值
【发布时间】:2013-03-25 22:38:50
【问题描述】:

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

"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

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

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

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

【问题讨论】:

标签: r sum na


【解决方案1】:

sum 有一个na.rm 参数,将其设置为TRUE,您将删除NA。 (一般是1+NA = NA,所以你要删除NA的值)

话虽如此,鉴于您的向量是字符,您的 &lt;0 条件有点偷偷摸摸(在这种情况下它确实有效,但我不想假设它是健壮的)

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

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})

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2016-03-08
      • 2019-07-10
      • 2020-07-15
      相关资源
      最近更新 更多