【问题标题】:Numeric Matching / Extracting with Hard Coded Values in R使用 R 中的硬编码值进行数值匹配/提取
【发布时间】:2018-03-12 00:02:09
【问题描述】:

无法理解 R 中的数字匹配/索引。

如果我有创建数据框的情况,例如:

options(digits = 3)
x <- seq(from = 0, to = 5, by = 0.10)
TestDF <- data.frame(x = x, y = dlnorm(x))

我想将硬编码值与我的 y 列进行比较 -

> TestDF[TestDF$y == 0.0230,]$x
numeric(0)

话虽如此,如果我与直接来自数据帧的值进行比较(对于 4.9 的 x 值,应该是 0.0230 的 y 值)。

> TestDF[TestDF$y == TestDF[50,]$y,]$x
[1] 4.9

这与精确匹配有关吗?如果我将数字限制为小数点后 3 位,那么 0.0230000 将与我要比较的 y 中的原始值不同?如果是这种情况,如果我确实需要根据四舍五入的硬编码值提取值,是否有解决方法?

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用round() 函数将小数位数减少到浮点数的首选小数位数。见下文。

    set.seed(1L)
    x <- seq(from = 0, to = 5, by = 0.10)
    TestDF <- data.frame(x = x, y = dlnorm(x))
    constant <- 0.023
    TestDF[ with(TestDF, round(y, 3) == constant), ]
    #      x          y
    # 50 4.9 0.02302884
    

    【讨论】:

      【解决方案2】:

      您可以将四舍五入的y 与规定的值进行比较:

      > any(TestDF$y == 0.0230)
      [1] FALSE
      > any(round(TestDF$y, 3) == 0.0230)
      [1] TRUE
      

      我不确定您是否理解 digits 选项的含义。来自?options,它说的是digits

      digits:控制打印数值时要打印的有效位数。

      (强调我的。)所以这只会影响值的打印方式,而不影响它们的存储方式。

      您生成了一组实数,其中没有一个完全是 0.0230。这与精确匹配无关。您指示的值应该是0.0230 实际上存储为

      > with(TestDF, print(y[50], digits = 22))
      [1] 0.02302883835550340041465
      

      不管options 中的digits 设置如何因为该设置只影响打印的 值。而且问题不是完全匹配,因为即使使用推荐的比较方法允许的小软糖,all.equal()y[50]0.0230 仍然不相等

      > with(TestDF, all.equal(0.0230, y[50]))
      [1] "Mean relative difference: 0.001253842"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        • 2019-08-01
        • 2018-10-30
        • 2020-07-03
        • 1970-01-01
        相关资源
        最近更新 更多