Ich würde mich wundern, wenn dies kein Dup, aber ich konnte keine Lösung finden.Vektorisierte Gleichheitsprüfung
Ich verstehe die Einschränkungen von ==
zum Testen der Gleichheit von Gleitkommazahlen. Man sollte all.equal
0.1 + 0.2 == 0.3
# FALSE
all.equal(0.1 + 0.2, 0.3)
# TRUE
verwenden
Aber ==
den Vorteil hat, von vektorisiert werden:
set.seed(1)
Df <- data.frame(x = sample(seq(-1, 1, by = 0.1), size = 100, replace = TRUE),
y = 0.1)
Df[Df$x > 0 & Df$x < 0.2,]
## x y
## 44 0.1 0.1
## 45 0.1 0.1
# yet
sum(Df$x == Df$y)
# [1] 0
Ich kann eine (sehr schlecht) schreiben funktionieren mich:
All.Equal <- function(x, y){
stopifnot(length(x) == length(y))
out <- logical(length(x))
for (i in seq_along(x)){
out[i] <- isTRUE(all.equal(x[i], y[i]))
}
out
}
sum(All.Equal(Df$x, Df$y))
, die die richtige Antwort gibt, aber es ist noch ein weiter Weg.
microbenchmark::microbenchmark(All.Equal(Df$x, Df$y), Df$x == Df$y)
Unit: microseconds
expr min lq mean median uq max neval cld
All.Equal(Df$x, Df$y) 9954.986 10298.127 20382.24436 10511.5360 10798.841 915182.911 100 b
Df$x == Df$y 16.857 19.265 29.06261 30.8535 38.529 45.151 100 a
könnte eine weitere Option:
All.equal.abs <- function(x,y){
tol <- .Machine$double.eps^0.5
abs(x - y) < tol
}
, die zu ==
vergleichbar führt.
Was ist eine vorhandene Funktion, die diese Aufgabe ausführt?
Closest ich denken kann, ist 'mit (Df, mapply (function (a, b) IsTrue (all.equal (a, b)), x, y))' aber das wäre wahrscheinlich nicht besser sein als das, was Sie bereits getan haben. Mit '.mapply()' (bare bones 'mapply()') können Sie die Geschwindigkeit etwas erhöhen. –
'Abs (x-y)
fishtank