R 是否在同一进动下对向量值进行逻辑检查

R 是否在同一进动下对向量值进行逻辑检查,r,diff,logical-operators,digit,R,Diff,Logical Operators,Digit,我有一个向量,里面有可变元素,我想检查它的最后两个元素是否在相同的数字顺序 例如,如果最后两个向量为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) x我可能想得太多了

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

例如,如果最后两个向量为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)

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

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

@罗尔担心过度思考。我想我也应该这样做。这就是我想到的,注意到这处理了浮点数的打印表示有时是欺骗的事实

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

这就是为什么我们需要isTRUE(all.equal(…,…)

@rawr ok我编辑过。你的意思是想看看这两个数字中的第一个非零数字的顺序是否假定它们具有相同的位值?所以
c(0.019,0.011)
是真的而
c(0.01,0.001)
是假的?现在可以了。我还需要多想想。也许我应该说最后两个值,如果Compariable返回
TRUE
@Alexander你说Compariable是什么意思?我的意思是它们彼此相同。假设0.01和0.015相同,但0.01和0.0010不同。
g
函数表示找不到函数
oo
@亚历山大:我不明白,你怎么称呼g
f(c(0.01,0.015))
是真的,
f(c(0.01,0.0010))
是假的,这不是应该发生的吗?
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
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
> sapply( 10^5*c(0.00014 , 0.00012 ), trunc, 4)
[1] 13 12