2016-04-12 49 views
2

İçinde değişken elemanlara sahip bir vektör var ve son iki öğenin aynı basamak sırasına göre olup olmadığını kontrol etmek istiyorum. Örneğin, son iki vektör 0,0194 ve 0,0198 ise TRUE değerini döndürür. Örneğin, son iki vektör TRUE döndürür. çünkü sıfırdan sonraki basamak sırası aynıdır (0.01 sıra 10^-2). ! Diğer örnek için sayı 0.00014 ve 0.00012 olabilir, bu yüzden onların hassasiyeti hala aynıdır, fonksiyon TRUE da geri dönmelidir.Aynı değerdeki vektör değerlerinin mantıksal kontrolü

Bunu kontrol etmek için nasıl mantıklı bir ifade veya işlev oluşturabiliriz.

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

@rawr gerekir: Ayrıca dikkat edin. – Alexander

+0

Yani her ikisi de sıfır olmayan ilk basamak aynı yer değerine sahip oldukları varsayılarak sipariş olup olmadığını görmek istersiniz? Yani c (0.019, 0.011) 'dır ve c (0,01, 0,001)' yanlıştır? – rawr

+0

@rawr yeap tam olarak! – Alexander

cevap

4

ben aşırı düşünme bu olabilir, ancak büyüklük ve ilk sıfır olmayan rakama sırası her biri için aynı olduğunu test edebilirsiniz.

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 

Bu nedenle son iki, hem de büyüklük sırası -2 ve birinci sıfır olmayan basamaklı her ikisi için de 1'dir.

bir fonksiyonu koy:

İşte
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 

aşırı düşünme hakkında

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 
+0

şimdilik sorun değil. Daha fazla düşünmem gerek. Belki de karşılaştırılabilir geri dönüş 'TRUE' – Alexander

+0

@Alexander ile karşılaştırmalı olarak ne demek istiyorsun? – rawr

+0

Ne demek istediğimi birbirleriyle özdeşler. 0.01 ve 0.015'in aynı olduğunu ve 0.01 ve 0.0010'un olmadığını söyler. – Alexander

2

@rawr endişeleri son n kontrol yerine 2 için yukarıda daha genel fonksiyonudur. Sanırım ben de yapmalıyım. Bu benim ortaya çıktığım şeydir ve bunun, kayan nokta sayılarının basılı temsillerinin bazen aldatıcı olduğu gerçeğini ele aldığına dikkat edin.

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 

Benim özgün çabaları signif fonksiyonu ile ama 0.01 ve 0.001 anlamlı basamak sayısı aynıdır beri, farklı bir sayısal düşünce yörünge var. oldu

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

neden ben düzenlenebilir Tamam isTRUE(all.equal(... , ...))

+0

Çabalarınız için teşekkürler! – Alexander