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:
- 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.
- 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.
Was ist das Endprodukt, das Sie daraus machen wollen? Geht alles nur in einer Reihe? – MrFlick
3 Listen wäre in Ordnung. – mzakaria
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