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

  • 本文关键字:元素 双精度 向量 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. 很好,因为该位置的计算结果为 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命令显示数据的内部表示形式,这与控制台打印给您的内容不同。

在不知道自己要完成什么的情况下,很难说该做什么。

最新更新