2017-03-13 3 views
0

Ich versuche, eine Datenprobe zu lesen wie folgt:Lesen dat-Datei mit zwei Trennzeichen unter Verwendung von R

1344428: -1,1, -1415, -649,0.00; -1,2, - 1,1090, -2167,0,00, -1,3, -1, -881, -3164,0,00, -1,4, -1, -624,1529,0,00, -1,5, -1, -849 , -2875,0.00; -1,6, -1,856, -2341,0,00; -1,7, -1,758, -2408,0,00; -1,8, -1, -201, -2307,0,00; -1 , 9, -1, -963, -2807, 00, -1,10, -1, -460, -3309, 00, -1, 11, -1, -1645, -1773, 00, -1,12 -1,1487, -518,0,00, -1,13, -1,685, -3113,0,00, -1,14, -1, -935, -3217,0,00, -1,15, -1, -1101 -2430,0.00; -1,16, -1,754, -2946,0,00; -1,17, -1,823, -2497,0,00; -1,18, -1, -948, -2431,0,00; -1 , 19, -1,774, -2242,0,00, -1,20, -1,861, -2192,0,00, -1,21, -1,433, -3391,0,00, -1,22, -1,133, -2190,0,00; -1,23, -1, -977, -2585,0,00; -1,24, -1, -968, -2107,0,00; -1,25, -1,175, -3062,0,00; -1,26, -1,265, -2736,0,00; -1,27, -1,67, -2 735,0,00; -1,28, -1, -281, -2752,0,00; 4,29, -1,5550,4400,0,00;: 174, -2563,11,28,67, A, Dead, SetAway ;: 1344429: -1,1, -1,415, -649,0,00; -1,2, -1,1090, -2167,0,00; -1,3, -1, -885, -3169,0,00; -1, 4, -1, -626,1527,0,00; -1,5, -1, -852, -2887,0,00; -1,6, -1,854, -2340,0,00; -1,7, -1,761, - 2411,0,00; -1,8, -1, -201, -2307,0,00; -1,9, -1, -967, -2808,0,00; -1,10, -1, -460, -3309, 0,00; -1,11, -1, -1647, -1777,0,00; -1,12, -1,1485, -518,0,00; -1,13, -1,687, -3118,0,00; -1,14 -1, -938, -3222,0.00, -1,15, -1, -1100, -2430,0,00, -1,16, -1,744, -2946,0,00, -1,17, -1,815, - 2505,0,00; -1,18, -1, -950, -2429,0,00; -1,19, -1,773, -2237,0,00; -1,20, -1,861, -2190,0,00; -1,21 , -1,433, -3392,0,00; -1,22, -1,133, -2189,0,00; -1,23, -1, -980, -2593,0,00; -1,24, -1, -961, - 2109,0,00; -1,25, -1,176, -3056,0,00; -1,26, -1,265, -2731,0,00; -1,27, -1,67, -2736,0,00; -1,28, -1, -283, -2746, 00, 4,29, -1, 5550, 4400, 00,: 174, -2563, 11, 28, 67, A, Tot, SetAway ;:

Die Daten in 3 Stücke getrennt wird:

  1. Die erste ein Zeitstempel mit der Endung „:“ Wir können dies halten als numerische
  2. dann mehrere Sätze von Zahlen (Vielfaches von sechs), die mit „; :“
  3. schließlich ein dritte chunk (7 Elemente, gemischt zwischen Saite und numerischen) mit der Endung‚;:‘

ein eleganter Weg, um diese Daten in R-Datenrahmen zu lesen, ist es? Ich habe versucht,

read.table("855360.dat", 
         header = FALSE, 
          sep = ";") 

aber es erfordert viel Manipulation der Elemente in die drei Stücke zu setzen, kann ich sie verbinden und manipulieren?

+0

Was ist das Endprodukt, das Sie daraus machen wollen? Geht alles nur in einer Reihe? – MrFlick

+0

3 Listen wäre in Ordnung. – mzakaria

+0

Drei Vektoren von was? Drei Vektoren für jede Reihe?Das ist kein sehr "tabellarisches" Format, also wäre es nicht gut für einen data.frame geeignet. Willst du eine Liste von Listen oder etwas? – MrFlick

Antwort

1

Wenn ein einzelner Datenrahmen Ergebnis OK ist dann ersetzen Sie einfach Kolon und Semikolon mit Komma und lesen Sie es in:

L <- readLines("myfile") 
read.table(text = gsub("[:;]+", ",", L), sep = ",", as.is = TRUE) 

oder wenn Sie wollen dann L von oben mit einer verschachtelten Listenstruktur erzeugen:

lapply(lapply(strsplit(L, ":"), strsplit, ";"), lapply, strsplit, ",") 
+0

Danke G Grothendieck. Dies ist in der Tat, was ich gefragt habe. Ich könnte erwähnen, dass der erste Ansatz eine Menge Zeit benötigt und eine völlig einheitliche tabellarische Daten benötigt. Testen mit 50k Zeilen dauerte 189 Sekunden! Nicht der Fall für den zweiten Ansatz oder die Methode in der erste Antwort. – mzakaria

0

Wenn dies in einen Multi-Pass-Prozess umgewandelt wird, kann es etwas länger dauern, aber auf lange Sicht einfacher zu ändern und zu warten.

Wenn Sie beginnen, indem Sie die Zeichenfolge durch die ";:" Zeichen teilen, werden Sie bemerken, dass die ungeraden Indizes die Hauptdaten sind (einschließlich Zeitstempel), und die geraden Indizes sind Ihre "dritten Chunk" mit gemischten num/char Einträge. Wenn Sie das Problem lösen, werden Sie feststellen, dass wir immer noch ein Parsing-Problem haben, aber es ist ein wenig einfacher.

txt <- "1344428:-1,1,-1,415,-649,0.00;-1,2,-1,1090,-2167,0.00;-1,3,-1,-881,-3164,0.00;-1,4,-1,-624,1529,0.00;-1,5,-1,-849,-2875,0.00;-1,6,-1,856,-2341,0.00;-1,7,-1,758,-2408,0.00;-1,8,-1,-201,-2307,0.00;-1,9,-1,-963,-2807,0.00;-1,10,-1,-460,-3309,0.00;-1,11,-1,-1645,-1773,0.00;-1,12,-1,1487,-518,0.00;-1,13,-1,685,-3113,0.00;-1,14,-1,-935,-3217,0.00;-1,15,-1,-1101,-2430,0.00;-1,16,-1,754,-2946,0.00;-1,17,-1,823,-2497,0.00;-1,18,-1,-948,-2431,0.00;-1,19,-1,774,-2242,0.00;-1,20,-1,861,-2192,0.00;-1,21,-1,433,-3391,0.00;-1,22,-1,133,-2190,0.00;-1,23,-1,-977,-2585,0.00;-1,24,-1,-968,-2107,0.00;-1,25,-1,175,-3062,0.00;-1,26,-1,265,-2736,0.00;-1,27,-1,67,-2735,0.00;-1,28,-1,-281,-2752,0.00;4,29,-1,5550,4400,0.00;:174,-2563,11,28.67,A,Dead,SetAway;: 1344429:-1,1,-1,415,-649,0.00;-1,2,-1,1090,-2167,0.00;-1,3,-1,-885,-3169,0.00;-1,4,-1,-626,1527,0.00;-1,5,-1,-852,-2887,0.00;-1,6,-1,854,-2340,0.00;-1,7,-1,761,-2411,0.00;-1,8,-1,-201,-2307,0.00;-1,9,-1,-967,-2808,0.00;-1,10,-1,-460,-3309,0.00;-1,11,-1,-1647,-1777,0.00;-1,12,-1,1485,-518,0.00;-1,13,-1,687,-3118,0.00;-1,14,-1,-938,-3222,0.00;-1,15,-1,-1100,-2430,0.00;-1,16,-1,744,-2946,0.00;-1,17,-1,815,-2505,0.00;-1,18,-1,-950,-2429,0.00;-1,19,-1,773,-2237,0.00;-1,20,-1,861,-2190,0.00;-1,21,-1,433,-3392,0.00;-1,22,-1,133,-2189,0.00;-1,23,-1,-980,-2593,0.00;-1,24,-1,-961,-2109,0.00;-1,25,-1,176,-3056,0.00;-1,26,-1,265,-2731,0.00;-1,27,-1,67,-2736,0.00;-1,28,-1,-283,-2746,0.00;4,29,-1,5550,4400,0.00;:174,-2563,11,28.67,A,Dead,SetAway;:" 

x <- strsplit(txt, ";:")[[1]] 
x <- sapply(x, trimws, USE.NAMES = FALSE) 
x[1] 
# [1] "1344428:-1,1,-1,415,-649,0.00;-1,2,-1,1090,-2167,0.00;-1,3,-1,-881,-3164,0.00;-1,4,-1,-624,1529,0.00;-1,5,-1,-849,-2875,0.00;-1,6,-1,856,-2341,0.00;-1,7,-1,758,-2408,0.00;-1,8,-1,-201,-2307,0.00;-1,9,-1,-963,-2807,0.00;-1,10,-1,-460,-3309,0.00;-1,11,-1,-1645,-1773,0.00;-1,12,-1,1487,-518,0.00;-1,13,-1,685,-3113,0.00;-1,14,-1,-935,-3217,0.00;-1,15,-1,-1101,-2430,0.00;-1,16,-1,754,-2946,0.00;-1,17,-1,823,-2497,0.00;-1,18,-1,-948,-2431,0.00;-1,19,-1,774,-2242,0.00;-1,20,-1,861,-2192,0.00;-1,21,-1,433,-3391,0.00;-1,22,-1,133,-2190,0.00;-1,23,-1,-977,-2585,0.00;-1,24,-1,-968,-2107,0.00;-1,25,-1,175,-3062,0.00;-1,26,-1,265,-2736,0.00;-1,27,-1,67,-2735,0.00;-1,28,-1,-281,-2752,0.00;4,29,-1,5550,4400,0.00" 
x[2] 
# [1] "174,-2563,11,28.67,A,Dead,SetAway" 

Eine wichtige hier Annahme ist, dass wir immer Paare haben von Zeitstempeln/Daten und Follow-on chunks:

if (length(x) %% 2 != 0) stop("oops, uneven pairs") 
odds <- seq(1, length(x), by = 2) 
str(x[odds]) 
# chr [1:2] "1344428:-1,1,-1,415,-649,0.00;-1,2,-1,1090,-2167,0.00;-1,3,-1,-881,-3164,0.00;-1,4,-1,-624,1529,0.00;-1,5,-1,-849,-2875,0.00;-1"| __truncated__ ... 
x[-odds] 
# [1] "174,-2563,11,28.67,A,Dead,SetAway" "174,-2563,11,28.67,A,Dead,SetAway" 

Von hier aus erkennen, dass wir einfach den Zeitstempel mit einer anderen strsplit extrahieren können, und dann kann der Rest in etwas umgewandelt werden read.csv durch ersetzen mag ";" mit Zeilenumbrüchen (gleiche mit Ihrem dritten chunk):

timestamps <- lapply(firstsplit, function(z) data.frame(timestamp = as.numeric(z[1]))) 
data1 <- lapply(firstsplit, function(lst) read.csv(textConnection(gsub(";", "\n", lst[[2]])), header = FALSE)) 
data2 <- lapply(secondsplit, function(z) read.csv(textConnection(z), header = FALSE)) 

einen Blick auf eines der Paare von Daten Taking:

bothlst <- mapply(list, timestamps, data1, data2, SIMPLIFY = FALSE) 
str(bothlst[[1]]) 
# List of 3 
# $ :'data.frame': 1 obs. of 1 variable: 
# ..$ timestamp: num 1344428 
# $ :'data.frame': 29 obs. of 6 variables: 
# ..$ V1: int [1:29] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... 
# ..$ V2: int [1:29] 1 2 3 4 5 6 7 8 9 10 ... 
# ..$ V3: int [1:29] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... 
# ..$ V4: int [1:29] 415 1090 -881 -624 -849 856 758 -201 -963 -460 ... 
# ..$ V5: int [1:29] -649 -2167 -3164 1529 -2875 -2341 -2408 -2307 -2807 -3309 ... 
# ..$ V6: num [1:29] 0 0 0 0 0 0 0 0 0 0 ... 
# $ :'data.frame': 1 obs. of 7 variables: 
# ..$ V1: int 174 
# ..$ V2: int -2563 
# ..$ V3: int 11 
# ..$ V4: num 28.7 
# ..$ V5: Factor w/ 1 level "A": 1 
# ..$ V6: Factor w/ 1 level "Dead": 1 
# ..$ V7: Factor w/ 1 level "SetAway": 1 

Dies ist eine nette verschachtelte Liste Darstellung Ihrer Daten. Ich machte absichtlich die timestamp a data.frame, um einen Schritt später zu vereinfachen, obwohl das sicherlich keine Voraussetzung ist.

Wenn Sie dies in einem einzigen data.frame mit allen Daten dargestellt wollen, gibt es zwei Dinge im Auge zu behalten:

  1. Ihre timestamp und „third-Chunk-Daten“ wird für alle Zeilen innerhalb der Daten wiederholt werden . Je nachdem, wie Sie die Daten verwenden möchten, ist dies möglicherweise kein Problem. Diese Methode bricht, wenn die Annahme einer einzelnen Zeile der Daten im "dritten Chunk" ungültig ist.
  2. Wir haben die gleichen Spaltennamen in den beiden Datenelementen. Dies ist ein Problem, das leicht vermieden werden kann, wenn Sie vordefinierte Spalten haben (immer 6 und 7 Spalten) oder wenn die Spalten in den Daten definiert sind (sie sind nicht in Ihrem Beispiel). Wenn keiner von beiden funktioniert, müssen Sie sich für eine Namenskonvention entscheiden, die für Sie funktioniert. Aus Gründen dieses Beispiels werde ich die zweite data.frame von V1 Benennung zu X1 Benennung ändern.

mit der Nummer 2 im Sinn:

data2mod <- lapply(data2, function(df) setNames(df, paste("X", seq_along(df), sep = ""))) 
bothlst2 <- mapply(list, timestamps, data1, data2mod, SIMPLIFY = FALSE) 

nun für jedes Element, können wir "column-bind" die Elemente in einem einzigen data.frame:

# bothdf <- lapply(bothlst2, cbind.data.frame) 
str(bothdf) 
# List of 2 
# $ :'data.frame': 29 obs. of 14 variables: 
# ..$ timestamp: num [1:29] 1344428 1344428 1344428 1344428 1344428 ... 
# ..$ V1  : int [1:29] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... 
# ..$ V2  : int [1:29] 1 2 3 4 5 6 7 8 9 10 ... 
# ..$ V3  : int [1:29] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... 
# ..$ V4  : int [1:29] 415 1090 -881 -624 -849 856 758 -201 -963 -460 ... 
# ..$ V5  : int [1:29] -649 -2167 -3164 1529 -2875 -2341 -2408 -2307 -2807 -3309 ... 
# ..$ V6  : num [1:29] 0 0 0 0 0 0 0 0 0 0 ... 
# ..$ X1  : int [1:29] 174 174 174 174 174 174 174 174 174 174 ... 
# ..$ X2  : int [1:29] -2563 -2563 -2563 -2563 -2563 -2563 -2563 -2563 -2563 -2563 ... 
# ..$ X3  : int [1:29] 11 11 11 11 11 11 11 11 11 11 ... 
# ..$ X4  : num [1:29] 28.7 28.7 28.7 28.7 28.7 ... 
# ..$ X5  : Factor w/ 1 level "A": 1 1 1 1 1 1 1 1 1 1 ... 
# ..$ X6  : Factor w/ 1 level "Dead": 1 1 1 1 1 1 1 1 1 1 ... 
# ..$ X7  : Factor w/ 1 level "SetAway": 1 1 1 1 1 1 1 1 1 1 ... 
# $ :'data.frame': 29 obs. of 14 variables: 
# ..$ timestamp: num [1:29] 1344429 1344429 1344429 1344429 1344429 ... 
# ..$ V1  : int [1:29] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... 
# ..$ V2  : int [1:29] 1 2 3 4 5 6 7 8 9 10 ... 
# ..$ V3  : int [1:29] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... 
# ..$ V4  : int [1:29] 415 1090 -885 -626 -852 854 761 -201 -967 -460 ... 
# ..$ V5  : int [1:29] -649 -2167 -3169 1527 -2887 -2340 -2411 -2307 -2808 -3309 ... 
# ..$ V6  : num [1:29] 0 0 0 0 0 0 0 0 0 0 ... 
# ..$ X1  : int [1:29] 174 174 174 174 174 174 174 174 174 174 ... 
# ..$ X2  : int [1:29] -2563 -2563 -2563 -2563 -2563 -2563 -2563 -2563 -2563 -2563 ... 
# ..$ X3  : int [1:29] 11 11 11 11 11 11 11 11 11 11 ... 
# ..$ X4  : num [1:29] 28.7 28.7 28.7 28.7 28.7 ... 
# ..$ X5  : Factor w/ 1 level "A": 1 1 1 1 1 1 1 1 1 1 ... 
# ..$ X6  : Factor w/ 1 level "Dead": 1 1 1 1 1 1 1 1 1 1 ... 
# ..$ X7  : Factor w/ 1 level "SetAway": 1 1 1 1 1 1 1 1 1 1 ... 

Von hier aus ist es eher geradlinig, um sie unabhängig voneinander zu behandeln, oder um sie auf ähnliche Weise zu kombinieren:

head(do.call("rbind", bothdf)) 
# timestamp V1 V2 V3 V4 V5 V6 X1 X2 X3 X4 X5 X6  X7 
# 1 1344428 -1 1 -1 415 -649 0 174 -2563 11 28.67 A Dead SetAway 
# 2 1344428 -1 2 -1 1090 -2167 0 174 -2563 11 28.67 A Dead SetAway 
# 3 1344428 -1 3 -1 -881 -3164 0 174 -2563 11 28.67 A Dead SetAway 
# 4 1344428 -1 4 -1 -624 1529 0 174 -2563 11 28.67 A Dead SetAway 
# 5 1344428 -1 5 -1 -849 -2875 0 174 -2563 11 28.67 A Dead SetAway 
# 6 1344428 -1 6 -1 856 -2341 0 174 -2563 11 28.67 A Dead SetAway 

Basierend auf meiner ersten Kugel oben, werden Sie feststellen, dass die timestamp Spalte und alle Spalten redundant sind, ähnlich einem Join von Tabellen.

Verwandte Themen