我遇到了与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) ?
还有其他方法吗?我需要行号,因为该价格的其他列中的值将被修改。
答案 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
的精确度和您的价格数据框应匹配。
答案 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.