2013-02-12 19 views
8

Sagen, ich habe diese beiden Datenrahmen:In R, Zusammenführen von zwei Datenrahmen, füllen unten die Rohlinge

big.table <- data.frame("idx" = 1:100) 

small.table <- data.frame("idx" = sample(1:100, 10), "color" = sample(colors(),10)) 

Ich möchte sie so zusammen fusionieren:

merge(small.table, big.table, by = "idx", all.y=TRUE) 

idx   color 
1  1   <NA> 
2  2   <NA> 
3  3   salmon2 
4  4   <NA> 
5  5   <NA> 
6  6   <NA> 
... 
20 20   <NA> 
21 21   <NA> 
22 22   blue4 
23 23   grey99 
24 24   <NA> 
25 25   <NA> 
26 26   <NA> 
... 

Jetzt muss ich Füllen Sie die Werte in der Spalte "Farbe" in der Tabelle nach unten, so dass alle NAs auf Werte gesetzt werden, die in der Tabelle davor stehen.

NOTES: Das Problem bezieht sich auf eine Protokolldatei, die von einem Computerprogramm generiert wird, nicht in einem Standardprotokollformat. Zeilenblöcke in dieser Protokolldatei gehören zu einem "Prozess", der in der ersten Zeile des Blocks identifiziert wird. Ich habe Informationen in den relevanten Zeilen der Protokolldatei extrahiert, von denen die meisten zu einem Prozess gehören, und eine Datentabelle erstellt, die diese Informationen enthält (die Zeilennummer, den Zeitstempel usw.). Jetzt muss ich in diese Tabelle die 'Prozess'-Namen eintragen, die jeder Zeile aus einer kleinen Tabelle mit einer Zeilennummer entsprechen.

Möglicherweise gibt es keinen 'Prozess' (Farbe im obigen Beispiel) für die Zeilen am oberen Rand der großen Tabelle. Diese Zeilen sollten weiterhin NA bleiben.

Sobald der erste 'Prozess' beginnt, gehört jede Zeile zwischen dieser Prozessstartlinie und der nächsten zum ersten Prozess. Wenn der zweite Prozess beginnt, gehört jede Zeile zwischen dieser Prozessstartlinie und der nächsten Prozessstartlinie zum zweiten Prozess. Und so weiter. Die Prozesslinien sind nie die gleiche Zeilennummer wie die anderen Zeilen, die ich in meinem Protokolldatei-Datenrahmen gesammelt habe.

Mein Plan ist es, die big.table zu erstellen, um eine Sequenz aller Protokollzeilennummern zu sein und die kleine Tabelle damit zu verschmelzen. Dann kann ich den Prozessnamen "ausfüllen" und die große Tabelle mit der Protokolldatei zusammenführen, wobei nur die Protokolldatei mit allem, mit dem sie verbunden ist, beibehalten wird.

Ich bin offen für andere Ansätze.

Antwort

13

Es klingt wie Sie na.locf aus dem Paket Zoo brauchen (steht für letzte observation carried forward):

library(zoo) 
tbl <- merge(small.table, big.table, by = "idx", all.y=TRUE) 
tbl$color2 <- na.locf(tbl$color,na.rm = FALSE) 
8

A data.table Lösung:

require(data.table) 
b <- data.table(big.table, key="idx") 
s <- data.table(small.table, key="idx") 
s[b, roll=T] 

#  idx   color 
# 1: 1    NA 
# 2: 2    NA 
# 3: 3    NA 
# 4: 4   blue3 
# 5: 5   blue3 
# 6: 6   blue3 
# 7: 7   blue3 
# 8: 8   blue3 
# 9: 9   blue3 
# 10: 10   blue3 
# 11: 11 navajowhite1 
# 12: 12 navajowhite1 
# . . . . 
Verwandte Themen