2013-07-04 17 views
5

Ho un vettore in R che contiene almeno 50.000 real. I valori sono ordinati da piccoli a grandi e ora ho bisogno di dividere questo vettore in diversi vettori. Il vettore deve essere scisso quando la differenza tra due numeri è maggiore di un dato numero (diciamo due).R, vettore diviso a indice sconosciuto

Esempio,

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); 

La difficoltà è che non conosciamo il numero di vettori necessari e non conosciamo la lunghezza di ogni vettore a dritto.

Ora ho la seguente idea, tuttavia questa operazione richiede molto tempo ed è in grado di suddividere il vettore in due nuovi vettori.

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; 
} 

Non vedo l'ora del tuo aiuto!

+0

quello che dovrebbe accadere quando si trova più punti di divisione possibile (cioè ci sono più punti in cui la differenza tra i numeri successivi è maggiore di 2)? –

risposta

7

Prova questo,

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

Questo è esattamente quello che sto cercando, fantastico! Non avrei mai pensato che fosse così facile. Inoltre, ho dovuto dividere un altro vettore agli stessi indeces. La soluzione semplice: y1 <- split (x, cumsum (c (0, diff (x)> = 2))); y2 <- split (z, cumsum (c (0, diff (x)> = 2))); – Michiel