2013-07-04 10 views
5

Ich habe einen Vektor in R, der mindestens 50.000 Real enthält. Die Werte sind von klein nach groß geordnet und ich muss diesen Vektor nun in verschiedene Vektoren aufteilen. Der Vektor muss aufgeteilt werden, wenn die Differenz zwischen zwei Zahlen größer ist als eine gegebene Zahl (z. B. zwei).R, gespaltener Vektor bei unbekanntem Index

Beispiel,

data <- c(1,1.1, 1.2, 4, 4.2, 8, 8.9, 9, 9.3); 
# Then I need the following vectors: 
x1 <- c(1, 1.1, 1.2); 
x2 <- c(4, 4.2); 
x3 <- c(8, 8.9, 9, 9.3); 

Die Schwierigkeit besteht darin, dass wir die Anzahl der benötigten Vektoren nicht kennen und nicht wissen, die Länge jedes Vektors in Vorhand.

Jetzt habe ich die folgende Idee, aber das ist sehr zeitaufwendig und es ist nur in der Lage, den Vektor in zwei neue Vektoren zu teilen.

j <- 2; 
seqDemA1 <- seqDemandA[1]; 
while((seqDemandA[j-1] - seqDemandA[j] < 2) && (j < length(seqDemandA)+1)) { 
    seqDemA1 <- c(seqDemA1, seqDemandA[j]); 
    j <- j+1; 
} 
seqDemA2 <- seqDemandA[j]; 
j <- j+1; 
while((seqDemandA[j-1] - seqDemandA[j] < 2) && (j < length(seqDemandA)+1)) { 
    seqDemA2 <- c(seqDemA2, seqDemandA[j]); 
    j <- j+1; 
} 

Ich freue mich auf Ihre Hilfe!

+0

Was geschehen soll, wenn Sie mehrere mögliche Splitpunkte (dh es gibt mehrere Punkte, an denen die Differenz zwischen aufeinanderfolgenden Zahlen größer als 2) zu finden? –

Antwort

7

Try this,

split(data, cumsum(c(0, diff(data)>=2))) 
+0

Das ist genau das, wonach ich suche, großartig! Ich hätte nie gedacht, dass es so einfach sein sollte. Darüber hinaus musste ich einen anderen Vektor auf die gleichen Indices teilen. Die einfache Lösung: y1 <- split (x, cumsum (c (0, diff (x)> = 2))); y2 <- Split (z, Cumsum (c (0, Diff (x)> = 2))); – Michiel