2016-07-25 6 views
-2

Ich habe Rohdaten mit der eindeutigen Kennung für jede Einheit in der Spalte mit den Timings gemischt. Um die Daten "zusammenzufassen", muss ich die uniqueID für jede Gruppe von Zeilen in der Spalte anhängen. Ein Teil meiner Schleife hat den obigen Klappentext abgeschnitten, dann führt ein 'iffelse' nach Text, strsplit, um die uniqueID zu erhalten, fügt dann ein, bis die nächste Textzeichenfolge gefunden wird, und wiederholt.R: Schnelle Methode zum bedingten Ersetzen von Spaltenwerten

Es funktioniert, aber es ist unglaublich langsam und ich muss es über viele rohe Daten wiederholen. (und ich habe keinen Zugriff auf die Herkunft Software die Form der Ausgabedatei zu ändern.)

durch die Foren Lese hat Lösungen für den Ersatz with a single variable gefunden, aber ich brauche eine Methode, um es von einer Linie zu extrahieren in der df.

Beispiel df:

 time   dist  v3   v4 
1: 2    10.2  ...   .... 
2: 3    10.2  ...   .... 
3: Veh: 123  
4: 1    10.2  ...   .... 
5: 2    10.2  ...   .... 
6: 3    10.2  ...   .... 
7: Veh: 456 
8: 1    10.2  ...   .... 
9: 2    10.2  ...   .... 


v <- 0001 
for (m in 1:length(k2$time)) { 
if(grepl('Veh', k2$time[m])) {v <- strsplit(k2$time[m], split=":")[[1]][2]} else{ k2$time[m]<-v } 
           } 

Durch sie als Schleife laufen Ich weiß es wird die Spalte einfügen nach unten arbeiten, bis es eine andere Textzeichenfolge trifft. Das gewünschte Ergebnis sieht so aus.

 time   dist  v3   v4 
1: 0001   10.2  ...   .... 
2: 0001   10.2  ...   .... 
3: Veh: 123  
4: 123   10.2  ...   .... 
5: 123   10.2  ...   .... 
6: 123   10.2  ...   .... 
7: Veh: 456 
8: 456   10.2  ...   .... 
9: 456   10.2  ...   .... 

ich dann eine andere Linie, die die ganze data.frame läuft durch und entfernt die Zeilen Text enthält, so kann ich zusammenfassen

Ist jemand bewusst eine schnellere Lösung, vielleicht dplyr oder data.frame mit? Ich gab es 15 Minuten vor dem Abbruch eines Durchlaufs über 922.000 Zeilen Code und ich brauche es über mehrere Millionen zu laufen.

Ich habe keine Suchkombinationen mehr auf Stack Overflow.

Mit data.table-1.9.7 und dplyr-0.5.0 auf R-3.3.1


EDIT: Apologies, reproduzierbares Beispiel:

time <- c(1,2,"Veh: 123", 1:3,"Veh: 456", 1:3) 
dist <- c(1:2,"",4:6,"",8:10) 
v3 <- c(1:2,"",4:6,"",8:10) 
k <-data.frame(time,dist,v3) 
k$time <- as.character(k$time) 

v <- 0001 
for (m in 1:length(k$time)) { 
if(grepl('Veh', k$time[m])) {v <- strsplit(k$time[m], split=":")[[1]][2] }else{ k$time[m]<-v }} 
+1

Hinweis: ' grepl() 'und' strsplit() 'sind beide vektorisiert. Das ist alles, was ich ohne ein reproduzierbares Beispiel tun kann. –

+0

[Machen Sie dies zu einem reproduzierbaren Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – shayaa

Antwort

0
library(data.table) 
library(stringr) 
time <- c(1,2,"Veh: 123", 1:3,"Veh: 456", 1:3) 
dist <- c(1:2,"",4:6,"",8:10) 
v3 <- c(1:2,"",4:6,"",8:10) 
k <- data.table(time,dist,v3) 

v <- 0001 
k[,time := ifelse(grepl('Veh: \\d+', time), str_match(time, 'Veh: (\\d+)')[,2], v)] 
+0

Ihre 'if' Aussage ist aufgeräumter als meine, aber sehen Sie die gewünschte Beispielausgabe oben. Wenn das VehID nicht in die Zellen darunter getragen wird, wird jedes Mal aktualisiert, wenn es auf eine neue "Veh: xxx" -Anweisung stößt. Ist diese Art von Operation effizient in R möglich? Oder ist mein Denken zu Excel-ish? –

Verwandte Themen