【问题标题】:R unique command and table command disagreeR唯一命令和表命令不一致
【发布时间】:2019-06-15 10:01:13
【问题描述】:

我有一个奇怪的问题。举例说明:

a <- c(3.099331946117620972814,
       3.099331946117621860992)

> unique(a)
[1] 3.099331946117620972814 3.099331946117621860992
> table(a)
a
3.09933194611762 
               2

所以unique() 正确识别出第 15 位之后的数字不同。 table() 但并不认为它们不同。

这可能是预期的行为,但它会导致我的一些代码出现错误,因为我需要它们都同意:

times <- sort(unique(times))
k <- as.numeric(table(times))

times 正确地提取了唯一时间。 k 应该是每次发生的次数,但由于上述问题,它没有正确执行此操作。

有没有人建议获得独特的和表同意? (或其他解决方法?)

【问题讨论】:

    标签: r floating-point unique


    【解决方案1】:

    从计算机的角度来看,尝试在浮点数上使用 uniquetable 在概念上是有问题的。本主题与R FAQ 7.31密切相关,摘录:

    唯一可以在 R 的数字类型中精确表示的数字是整数和分母是 2 的幂的分数。所有其他数字在内部四舍五入到(通常)53 位二进制精度。结果,两个浮点数将不会可靠地相等,除非它们是由相同的算法计算的,即使那样也不总是。例如,

    R> a <- sqrt(2)
    R> a * a == 2
    [1] FALSE
    R> a * a - 2
    [1] 4.440892e-16
    R> print(a * a, digits = 18)
    [1] 2.00000000000000044
    

    (还有其他示例,如果好奇,我鼓励您阅读该常见问题解答主题的更多内容。)

    因此,我建议您确定所需的精度,然后在寻找唯一性时准确使用这些数字。使用您的号码,您可以通过format(和sprintf)强制解决问题:

    a <- c(3.099331946117620972814,
           3.099331946117621860992)
    
    table(format(a, digits = 15))
    # 3.09933194611762 
    #                2 
    table(format(a, digits = 16))
    # 3.099331946117621 3.099331946117622 
    #                 1                 1 
    
    unique(format(a, digits = 15))
    # [1] "3.09933194611762"
    unique(format(a, digits = 16))
    # [1] "3.099331946117621" "3.099331946117622"
    

    出于好奇,uniquetable 不同的原因在于table 使用factor,而后者又使用as.character(y)。如果你做as.character(a),就是任意把精度降到14位:

    as.character(a)
    # [1] "3.09933194611762" "3.09933194611762"
    

    所以要回答您提出的问题uniquetable 不同,因为 table 最终使用 as.character,默认情况下此处截断为 14 位数字。 (因为它是一个原始的,你必须进入低级源才能弄清楚。)

    我在上面回答的问题是基于一个基本假设,即在浮点上使用 unique 是一件好事(我认为“它不是”)。

    【讨论】:

    • 很好的答案,谢谢。嗯,现在我的困境是什么是合理的精度,因为我想要这个相当普遍?但我想我会想办法的?
    • 其实。事实证明这很有用。我添加了一个变量来控制实际上现在允许用户决定什么时间差是有意义的数字,我认为这将有一些优势。再次感谢您的出色回答!
    • 用户控制的可配置性几乎总是 (imo) 增强器,提供透明度和灵活性。我真的很喜欢这样的“啊哈”时刻! (并不是每个人都同意认为相关的精确度,因此从用户的角度来看,这可能会被视为不那么自私:-)
    • 这个答案没有解释为什么table 认为这些数字是相同的。 R 存储的数字是不同的,正如unique 将它们识别为不同的事实所示。因此,关于它们如何在 R 中表示的文档并没有使它们难以区分。并且关于结果可能因计算方法而变化的文本是无关紧要的,因为我们在a 中有静态结果——传递给unique 的数据与传递给table 的数据相同。可能table 正在对其数据进行一些按摩,例如将其四舍五入以降低精度。在这种情况下,答案应该解释它。
    • 潜在问题似乎是由于table使用factor,它在数字上使用as.character,将其截断为14位。
    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 2020-02-09
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2020-10-21
    • 2021-02-15
    相关资源
    最近更新 更多