我有 2 个向量,一个是 8 个双精度数,另一个是 1000 个。 分配 10 个数字,如下所示
myDBL <- c(0.7644957248, -0.6612336692, -0.3755620978, -0.3715304872, -0.0759778128, 0.7515847845, -0.5997805210, 0.7625898273)
当我搜索特定的双精度时:
which(myDBL== -0.3755620978)
此返回位置 3. 很好,因为该位置的计算结果为 true。
因此,当我搜索具有 1000 个双精度变量的向量时,我得到整数(0(
我知道我正在寻找的双精度在第二个向量中。 为什么"哪个"找不到它?
使用 str((,两个向量报告相同,除了长度。(一个是 8,另一个是 1000(。 我还通过使用 as.vector(( 加载它们来确保两个向量都是向量。 ...是的 - 我是 R 的新人。
有没有更有效的替代方案?我还注意到,如果在较小的向量中,我有两次相同的数字,它只报告最后一个的位置。 我想将它们全部报告到一个单独的向量中。
谢谢
法案
双打可能会变得有点奇怪,好像它们看起来一样,在最小的小数位可能会有一些舍入误差,使它们不相等。如果我是你,我会将两个向量四舍五入到相同的小数位数,然后进行搜索。
vector1 <- round(vector1, 10)
vector2 <- round(vector2, 10)
which(vector1[1] == vector2) #Assuming you want to find the first element of vector 1
如果没有看到数据,很难确定这是否会解决问题。但是,除非您能提供有关如何加载 1000 个元素向量的更多信息并提供数据,否则希望这会起作用。
如果这仍然不起作用,也许最好的选择是追求一定程度的准确性。
which(vector1[1] - vector2 < 1e-10) #Assuming you want to find the first element of vector 1
由于舍入误差,测试浮点数的相等性通常是一个坏主意。一种标准解决方案是包括考虑此类错误的容差。像这样:
which(abs(-0.3755620978 - myDBL) < 0.000001)
公差可以变小(或变大(以满足您的需求。
是一个很好的实例,可以使用%in%
:
smallVector <- sample(1:1000, 25)
bigVector <- sample(1:1000, 2000, replace = T)
which(bigVector %in% smallVector)
[1] 3 22 51 140 148 219 239 314 350 355 373 374 394 395 396 427 450 489 542 550
[21] 625 633 713 739 864 889 908 955 1003 1029 1071 1102 1123 1173 1198 1238 1341 1355 1376 1383
[41] 1392 1426 1429 1476 1529 1552 1574 1612 1658 1711 1721 1733 1808 1831 1902 1917 1969 1975
这将返回一个索引,其中来自较长向量的哪些项位于较小的向量中,而无需==
。
如果绝对需要执行此操作,最好的办法是将所有数字转换为字符串,并对字符串数据执行==
操作。
话虽如此,正如已经指出的那样,测试浮点数的相等性将是一个非常糟糕的主意。这是因为浮点数不是以内部存储的方式打印给您的。简单的例子:
x <- 1/9
x
[1] 0.1111111
dput(x)
0.111111111111111
x == 0.1111111
[1] FALSE
dput
命令显示数据的内部表示形式,这与控制台打印给您的内容不同。
在不知道自己要完成什么的情况下,很难说该做什么。