2016-04-12 17 views
2

Ich habe einen Vektor mit variablen Elementen darin, und ich möchte überprüfen, ob es die letzten beiden Elemente in der gleichen Reihenfolge sind. Beispiel: Wenn die letzten beiden Vektoren 0.0194 und 0.0198 sind, geben Sie TRUE zurück. weil ihre Ziffernfolge nach Null gleich ist (0.01 Ordnung 10^-2). ! für ein anderes Beispiel könnte die Zahl 0,00014 und 0,00012 sein, so dass ihre Genauigkeit immer noch ungefähr gleich ist, die Funktion sollte auch TRUE zurückgeben.logische Überprüfung der Vektorwerte bei der gleichen Präzession oder nicht

Wie können wir eine logische Anweisung oder Funktion erstellen, um dies zu überprüfen.

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

@rawr ok ich bearbeitet. – Alexander

+0

Sie meinen, Sie wollen sehen, ob die erste Ziffer ungleich Null in beiden sind, vorausgesetzt, sie haben den gleichen Stellenwert? also 'c (0.019, 0.011)' ist wahr und 'c (0.01, 0.001)' ist falsch? – rawr

+0

@raw yeap genau! – Alexander

Antwort

4

Ich kann über denken dies sein, aber Sie können testen, ob die Größenordnung und die erste Ziffer ungleich Null für jede identisch sind.

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 

So für die letzten zwei, ist die Größenordnung für beide -2 und die erste Nicht-Null-Ziffer 1 für beide.

in eine Funktion Put:

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 

Hier ist eine allgemeinere Funktion als die oben für die letzte n statt 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 
+0

ist es in Ordnung für jetzt. Ich muss auch mehr nachdenken. Vielleicht sollte ich letzten zwei Wert sagen, wenn vergleichbare Rückkehr 'TRUE' – Alexander

+0

@Alexander was meinst du mit vergleichbar? – rawr

+0

was ich damit meine, dass sie identisch sind. sagen 0,01 und 0,015 sind identisch, aber 0,01 und 0,0010 ist nicht identisch. – Alexander

2

@rawr Sorgen über Überdenken überprüfen. Ich denke, ich sollte es auch tun. Dies ist, was ich erfunden habe, und beachten Sie, dass dies die Tatsache handhabt, dass Druckdarstellungen von Fließkommazahlen manchmal täuschen.

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 

Meine ursprünglichen Bemühungen waren mit der Signif Funktion aber das ist eine andere numerische Gedanke Bahn, da 0,01 und 0,001 die gleiche Anzahl von signifikanten Stellen haben. Beachten Sie auch, dass:

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

weshalb wir brauchen die isTRUE(all.equal(... , ...))

+0

danke für deine Mühe! – Alexander

Verwandte Themen