2016-04-08 12 views
0

Ich habe einen Datenrahmen mit zwei Spalten, eine Indexspalte, die Zeilen in einem zweiten Datenrahmen indiziert. Diese Zeilen enthalten alle ein bestimmtes Ereignis. Welches Ereignis das ist, ist in der zweiten Spalte, hier code_start_stop genannt, codiert.R clevere Art, Datenrahmen zu bereinigen

Beispiel:

index <- c(769, 766, 810, 813, 830, 842, 842, 892, 907, 944) 
code_start_stop <- c(2006, 2001, 2004, 1001, 1004, 2001, 1001, 1006, 2004, 1004) 
replace_all <- data.frame(index, code_start_stop) 

Nun gibt es Paare von Start-/Codes stoppen, dh 2001 und 1001, 2002 und 1002, usw. Das Ziel ist, dass den Fall gibt es Zeilen, die durch ein eingeschlossen sind Startmarker (dh hier 2006) und der jeweils nächste Stoppmarker (hier 1006), sollten diese Zeilen aus dem Datenrahmen entfernt werden. Beachten Sie, dass immer Startmarken & sind.

Alle Vorschläge für eine clevere Art, dies zu tun, sind willkommen. Vielen Dank!

+0

'Index entfernen 'und' code_start_stop' haben hier unterschiedliche Längen, so dass 'replace_all' nicht mit dem aktuellen Code erstellt werden kann. – alistaire

Antwort

0

Ihre Frage ist ein wenig verwirrend, bitte korrigieren Sie mich, wenn ich es falsch verstanden habe. Die folgenden sollte funktionieren:

startm <- 2006 #startmarker 
endm <- 1006 #endmarker 

#look for row that contains markers 
index1 <- which(replace_all[,2] == startm) 
index2 <- which(replace_all[,2] == endm) 

#subset accordingly 
replace_all <- replace_all[-(index1:index2),] 

Hinweis: Dies beseitigt auch die Zeilen, die Marker enthält. Wenn Sie nur Zeilen zwischen den Markes entfernen möchten, fügen Sie beim Unterset- zungsschritt a + 1/-1 hinzu.

+0

Vielen Dank! Allerdings habe ich zunächst Paare von Start- und Endmarkierungen: 'startm1 <- 2001 endm1 <- 1001 .... startm6 <- 2006 endm6 <- 1006' Darüber hinaus kann jedes Paar Marker n auftreten mal im Datenrahmen (was deutlich größer ist als im obigen Beispiel). –

+0

Sie können einfach über diese Paare Schleife – maRtin

0

Die Lösung basiert nun auf MaRtins Vorschlag und scheint recht gut zu funktionieren.

ich folgende durch alle Paare von Start- und End-Marker gehen:

to_delete <- c() 
## Care = 2001/1001 
startm1 <- 2001 
endm1 <- 1001 
index1 <- which((replace_all[,2] == startm1)) 
index2 <- which((replace_all[,2] == endm1)) 
if(length(index1) !=0){ 
    for (i in 1:length(index1)){ 
    if (index2[i]-index1[i]>1){ 
     to_delete <- c(to_delete, (((index1[i])+1):((index2[i])-1))) 
    } 
    } 
} 

... gehen durch alle anderen Paare von Start/Marker stoppen und dann to_delete

if (length(to_delete) != 0){ 
    replace_all <- replace_all[-to_delete,] 
    } 
    replace_all <- replace_all[,1] 
    }