我有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的新人。
还有更高效的替代方案吗?我还注意到,如果在较小的向量中我有两次相同的数字,它只报告最后一个的位置。我想将它们全部报告到一个单独的载体中。
谢谢,
比尔
答案 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
命令显示数据的内部表示,这与您的控制台打印到您的内容不同。
很难说在不知道你想要完成什么的情况下该做什么。