【问题标题】:logical check of vector values at the same precesion or not是否在相同的精度下对向量值进行逻辑检查
【发布时间】:2016-04-12 01:56:45
【问题描述】:

我有一个包含可变元素的向量,我想检查它的最后两个元素是否在相同的数字顺序中。

例如,如果最后两个向量是 0.0194 和 0.0198,则返回 TRUE。因为它们在零之后的数字顺序是相同的(0.01 顺序 10^-2)。 !例如,数字可能是 0.00014 和 0.00012,因此它们的精度仍然大致相同,函数也应该返回 TRUE

我们如何构建一个逻辑语句或函数来检查这一点。

x<- c(0.817104, 0.241665, 0.040581, 0.022903, 0.019478, 0.019846)

【问题讨论】:

  • @rawr 好的,我编辑了。
  • 你的意思是你想看看两者中的第一个非零数字是否是有序的,假设它们具有相同的位置值?所以c(0.019, 0.011) 为真而c(0.01, 0.001) 为假?

标签: r diff logical-operators digit


【解决方案1】:

我可能想多了,但您可以测试每个数量级和第一个非零数字是否相同。

x <- c(0.817104, 0.241665, 0.040581, 0.022903, 0.019478, 0.019846)

oom <- function(x, base = 10) as.integer(ifelse(x == 0, 0, floor(log(abs(x), base))))
oom(x)
# [1] -1 -1 -2 -2 -2 -2

(tr <- trunc(x / 10 ** oom(x, 10)))
# [1] 8 2 4 2 1 1

所以对于最后两个,两者的数量级都是 -2,第一个非零数字都是 1。

放入函数中:

f <- function(x) {
  oom <- function(x, base = 10) as.integer(ifelse(x == 0, 0, floor(log(abs(x), base))))
  x <- tail(x, 2)
  oo <- oom(x)
  tr <- trunc(x / 10 ** oo)
  (oo[1] == oo[2]) & (tr[1] == tr[2])
}

## more test cases
x1 <- c(0.019, 0.011)
x2 <- c(0.01, 0.001)

f(x)  ## TRUE
f(x1) ## TRUE
f(x2) ## FALSE

这是一个比上面更通用的函数,用于检查最后一个 n 而不是 2

g <- function(x, n = 2) {
  oom <- function(x, base = 10) as.integer(ifelse(x == 0, 0, floor(log(abs(x), base))))
  x <- tail(x, n)
  oo <- oom(x)
  tr <- trunc(x / 10 ** oo)
  Reduce(`==`, oo) & Reduce(`==`, tr)
}

g(c(.24, .15, .14), 2)  ## TRUE
g(c(.24, .15, .14), 3)  ## FALSE

【讨论】:

  • 暂时没问题。我还需要多想。如果可比较的回报率TRUE,也许我应该说最后两个值
  • @Alexander 你所说的可比较是什么意思?
  • 我的意思是它们彼此相同。说 0.01 和 0.015 相同,但 0.01 和 0.0010 不同。
  • g函数说找不到函数oo!
  • @Alexander 我不明白,你怎么打电话给gf(c(0.01, 0.015)) 为真,f(c(0.01, 0.0010)) 为假,这不应该发生吗?
【解决方案2】:

@rawr 担心过度思考。我想我也应该这样。这就是我想出的,请注意,这可以处理浮点数的打印表示有时具有欺骗性的事实。

orddig <- function(x) which( sapply( 0:16, function(n){ isTRUE(all.equal(x*10^n ,  
                                                                   round(x*10^n,0)))}))[1]
> sapply( c(0.00014 , 0.00012 ), orddig)
[1] 6 6

我最初的努力是使用 signif 函数,但这是一个不同的数字思维轨迹,因为 0.01 和 0.001 具有相同数量的有效数字。另请注意:

> sapply( 10^5*c(0.00014 , 0.00012 ), trunc, 4)
[1] 13 12

这就是我们需要isTRUE(all.equal(... , ...))的原因

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多