Ich habe einen Vektor von Zahlen. So wie diese, mit nur wenigen eindeutigen Werten:all.different Funktion in R, wenden Sie es in einer Schleife an?
set.seed(2)
a = rpois(1000, 0.3)
head(a, 20)
#### [1] 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 2 0 0 0
Nun, was ich brauche, ist für jede Zahl zu finden, wenn sich die vorherige und das folgende Element sind alle unterschiedlich. Ich habe versucht, eine Funktion all.different oder alle verschieden in R zu finden, erfolglos, so habe ich es:
all.diff = function(num) NROW(unique(num))==NROW(num)
Dann kam ich mit einem for
Schleife wie auf den Punkt:
ConsecutiveDifferent = function(vector) {
output = numeric(NROW(vector)-2)
for (i in 2:(NROW(vector)-1)) {
trio <- c(vector[i-1], vector[i], vector[i+1])
if (all.diff(trio)) output[i]<-1
}
return(output)
}
res = ConsecutiveDifferent(a)
head(res, 20)
#### [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
Es tut der Job, aber da mein Vektor eine Länge von mehreren hundert Millionen hat, habe ich mich gefragt, ob es einen besseren Weg als eine Schleife gab.
Danke,
EDIT
Danke für so viele Lösungen bekommen! Ich konnte nicht entscheiden, wessen Antwort angenommen werden muss, also habe ich einen Mikrobenmark (Länge = 50000) gemacht und der Preis geht an Franck. Danke auch für die ausführliche Antwort.
Nicht sicher, warum Sie NROW verwenden. 'Länge' ist das übliche für Vektoren. – Frank
du hast Recht, das ist ein schlechter Habit ...;-) – agenis
Aus Neugier, sind das viel von einer Verbesserung gegenüber Ihrem ursprünglichen Code (den ich in der Benchmark nicht sehe)? – Frank