Da Sie einen Vektor von 1 und 0 möchten, können Sie einfach Umkehren Sie Ihre Bedingung, konvertieren Sie die logischen Werte in Integer und erstellen Sie eine neue Matrix mit den gleichen Dimensionen wie m
.
matrix(as.integer(m >= threshold), nrow(m))
Sie können auch einfach den Matrix-Modus ändern. Normalerweise Modi ändern in zwei Linien durchgeführt werden würde, aber man kann es mit
`mode<-`(m >= threshold, "integer")
Zusätzlich in einem tun, als @nicola betont, ist die schnelle und schmutzige Methode
(m >= threshold) + 0L
die Null Durch das Hinzufügen Integer wir zwingen die gesamte Matrix zu Integer.
Ein paar andere (dank @Frank):
+(m >= threshold)
m[] <- m >= threshold
Also im Grunde ja. Alle diese führen die Aufgabe in einer Linie durch und ich kann fast garantieren, dass sie alle schneller sind als ifelse()
.
Einige Benchmarks auf einer größeren Matrix (mit dem Ersatz-Verfahren weggelassen):
m <- matrix(rnorm(1e7), ncol=100)
threshold <- 0.5
library(microbenchmark)
microbenchmark(
matrix = matrix(as.integer(m >= threshold), nrow(m)),
mode = `mode<-`(m >= threshold, "integer"),
plus0 = (m >= threshold) + 0L,
unary = +(m >= threshold)
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# matrix 295.9292 315.4463 351.9149 351.8144 379.9840 453.4915 100
# mode 163.2156 172.0180 208.9348 202.8014 232.4525 347.0616 100
# plus0 170.2059 177.6111 202.3536 192.3516 223.8284 294.8367 100
# unary 144.0128 150.2696 183.2914 173.4010 203.7955 382.2397 100
Aus Gründen der Vollständigkeit, hier ein Maßstab auf der Ersatzmethode ist times = 1
verwenden.
microbenchmark(
replacement = { m[] <- m >= threshold },
times = 1
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# replacement 499.4005 499.4005 499.4005 499.4005 499.4005 499.4005 1
groß - liebe es – Megatron
Auch '(m> = Schwelle) + 0L'. – nicola
@nicola Wenn Sie sich mit obskuren Zwängen zufrieden geben, können Sie auch '+ (m> = Schwellwert)' ' – Frank