R如何使用带有浮点值的which()?

时间:2017-07-20 05:57:44

标签: r

我遇到了与R which () function returns integer(0)

中描述的问题相同的问题
price = seq(4,7, by=0.0025)
allPrices = as.data.frame(price)
lookupPrice = 5.0600
which(allPrices$price == lookupPrice)

which()语句输出integer(0),表示不匹配。它应输出425,即该序列中匹配的行号。

我知道这是一个浮点问题。该链接建议以某种方式使用all.equal(x,y)

如何将all.equal()函数合并到which()语句中,以便在allPrices中得到与lookupPrice匹配的行号(在本例中为5.06) ?

还有其他方法吗?我需要行号,因为该价格的其他列中的值将被修改。

5 个答案:

答案 0 :(得分:2)

手动方法包括指定比较的容差并执行:

# tol = 1e-7: comparison will be TRUE if numbers are equal up to 
#   7 decimal places
tol = 1e-7
which(abs(allPrices$price - lookupPrice) < tol)

答案 1 :(得分:1)

您可以sapply超过所有价格并将all.equal函数应用于每个价格,以找到TRUE

的价格
which(sapply(price, all.equal, lookupPrice) == TRUE)
# [1] 425

答案 2 :(得分:1)

您还可以尝试将数据框中的价格四舍五入到小数点后4位:

which(round(allPrices$price, digits=4) == lookupPrice)
[1] 425

在四舍五入后,lookupPrice的精确度和您的价格数据框应匹配。

Demo

答案 3 :(得分:1)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <select class="form-control"> <option ></option> <option value="yellow">Yellow</option> <option value="red">Red</option> <option value="green">Green</option> <option value="blue">Blue</option> </select>中有一个函数near

dplyr

对于这种情况,您可以尝试:

near(x, y, tol = .Machine$double.eps^0.5)

答案 4 :(得分:0)

我遇到了完全相同的问题。

我最初通过在调用which()之前将两组数据从数字转换为带有as.character()的字符来修复它。

但是,我想弄明白为什么它不使用数字数据并做了一些进一步的故障排除。

看来问题在于R使用seq()生成十进制序列的方式。使用round()函数 - 正如Tim Biegeleisen所建议的那样 - 但我认为你只需要将它应用于seq()生成的数字。你可以在下面查看我的工作 - 错误是非常零星的,我只是尝试过数字,直到找到一个失败:19.2。

Memory protected with PAGE_NOACCESS cannot be locked.