从计算机的角度来看,尝试在浮点数上使用 unique 或 table 在概念上是有问题的。本主题与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"
出于好奇,unique 和table 不同的原因在于table 使用factor,而后者又使用as.character(y)。如果你做as.character(a),就是任意把精度降到14位:
as.character(a)
# [1] "3.09933194611762" "3.09933194611762"
所以要回答您提出的问题:unique 和 table 不同,因为 table 最终使用 as.character,默认情况下此处截断为 14 位数字。 (因为它是一个原始的,你必须进入低级源才能弄清楚。)
我在上面回答的问题是基于一个基本假设,即在浮点上使用 unique 是一件好事(我认为“它不是”)。