【问题标题】:Replace certain values of a vector with NA用 NA 替换向量的某些值
【发布时间】:2013-10-22 07:05:26
【问题描述】:

如果值 == -273.17,我正在尝试用 NA 替换向量的值。

这是一个示例数据:

x <- c(32,33,34,-273.17,32)

我想得到这个:

x <- c(32,33,34,NA,32)

这是我尝试过的

x <- apply(x, 1, 
                (if (x==-273.17)
                 {x==NA} ))

但是我得到了一个错误。谁能帮帮我?

【问题讨论】:

    标签: r


    【解决方案1】:

    布尔索引,类似于@Konrad.Rudolph 的回答,使用基于?all.equal 的默认容差:

    tol <- 0.5 * .Machine$double.eps # tolerance close to machine precision
    float.equal <- function(a, b, p.tol = tol) { abs(a - b) < p.tol }
    x[float.equal(x, -273.17)] <- NA
    

    如果您的要求可以简化为更易于编码的谓词,请考虑以下内容,例如:

    x[x<0] <- NA
    

    all.equal 处理长度相等的向量,并报告被比较的完整对象的相等性,而不是元素方面的相等性。

    对于 R 版本 3.0.1 (2013-05-16),isTRUE(all.equal()) 不会产生预期的结果:

    > all.equal(x, -273.17)
    [1] "Numeric: lengths (5, 1) differ"
    > isTRUE(all.equal(x, -273.17))
    [1] FALSE
    

    【讨论】:

    • 我没有测试 Konald 的答案,我不知道它不再起作用。谢谢!
    【解决方案2】:

    你通常会为此使用子集:

    x[x == -273.17] <- NA
    

    但是,请注意不要以这种方式比较浮点数。 all.equal 是更好的选择,因为它考虑到了表示的不准确性:

    x[isTRUE(all.equal(x, -273.17))] <- NA
    

    【讨论】:

      【解决方案3】:

      您可以使用ifelse

      ifelse(x==-273.17, NA, x)
      

      但我更喜欢@KonradRudolph 的回答。

      【讨论】:

      • 不过你的更容易理解。
      猜你喜欢
      • 2020-03-24
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2012-11-10
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多