如何在双精度向量中找到特定值的元素

时间:2018-01-31 21:52:15

标签: r

我有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.很好,因为该位置的评估结果为真。

所以当我用1000个双变量搜索向量时,我得到了 整数(0)

我知道我正在寻找的双重是在第二个向量中。为什么“哪个”找不到它?

使用str(),两个向量报告相同,但长度除外。 (一个是8,另一个是1000)。我还通过使用as.vector()加载它们来确保两个向量都是向量。 ......是的 - 我是R的新人。

还有更高效的替代方案吗?我还注意到,如果在较小的向量中我有两次相同的数字,它只报告最后一个的位置。我想将它们全部报告到一个单独的载体中。

谢谢,

比尔

4 个答案:

答案 0 :(得分:2)

双打可能会有点奇怪,好像它们看起来一样,在最小的小数位置可能会有一些舍入错误,这使得它们不相等。如果我是你,我会将我的两个向量四舍五入到相同的小数位数,然后进行搜索。

vector1 <- round(vector1, 10)
vector2 <- round(vector2, 10)

which(vector1[1] == vector2) #Assuming you want to find the first element of vector 1

如果没有看到数据,很难确定这是否会解决问题。但除非您能提供有关如何加载1000元素向量并提供数据的更多信息,否则希望这样做。

如果此STILL不起作用,或许最好的选择是达到一定的准确度。

which(vector1[1] - vector2 < 1e-10) #Assuming you want to find the first element of vector 1

答案 1 :(得分:1)

由于四舍五入的错误,测试浮点数是否相等往往是一个坏主意。一种标准解决方案是包含对此类错误进行核算的容差。类似的东西:

which(abs(-0.3755620978 - myDBL) < 0.000001)

可以使公差更小(或更大)以满足您的需求。

答案 2 :(得分:0)

这是使用%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

这将返回一个索引,其中较长的向量中的项目在较小的向量中,而不需要==

答案 3 :(得分:0)

如果您绝对需要完成此操作,最好的办法是将所有数字转换为字符串,并对字符串数据执行==操作。

话虽如此,正如已经指出的那样,测试浮点数的相等性将是一个非常糟糕的主意。这是因为浮动内容不会以内部存储方式打印给您。简单的例子:

x <- 1/9
x
[1] 0.1111111
dput(x)
0.111111111111111
x == 0.1111111
[1] FALSE

dput命令显示数据的内部表示,这与您的控制台打印到您的内容不同。

很难说在不知道你想要完成什么的情况下该做什么。