【发布时间】:2016-12-19 13:38:07
【问题描述】:
我有一个非常有趣的问题,虽然我不想有一个。 我必须将一个数字四舍五入,所以我遵循了解决方案here 它曾经工作正常,直到我发现 data.table 的错误
library(data.table)
options(digits = 20) # to see number representation
mround <- function (number, multiple) {
return(multiple * round(number / multiple))
}
DT = data.table(a = mround(112.3, 0.1), b = "B")
DT[a == 112.3,] # works as expected, i.e returns one row
DT[a == 112.3 & b == 'B', ] # doesn't work
公平地说,data.frame 甚至第一个过滤器也不起作用。任何想法如何解决这个问题?
【问题讨论】:
-
你的问题没有明确定义。您应该添加您期望的输出。这两行都为我返回了空的 data.tables。
-
data.table中的第一个语句对我不起作用,与data.table或data.frame无关,但这是floating point precision 的问题。请参阅DT[(a - 112.3)<1.e-6 & b == 'B',](使用 0.000001 的误差范围,如果您想要更精确,请参阅上面的链接或使用.Machine$double.eps^0.5和all.equal一样) -
FWIW,round 需要一个
digits参数,round(112.3,1)应该足够了,应该避免你的实际问题) -
@lmo 我希望在此过滤器中看到一行
-
@Tensibai round(112.3,1) 是一种解决方案,但不是通用的,因为我需要将函数舍入到 0.5
标签: r data.table