2010-11-05 5 views
39

Ich habe eine Datei, in der jede Zeile eine Reihe von Ergebnissen ist, die in einem bestimmten Replikat eines Experiments gesammelt wurden. Die Anzahl der Ergebnisse in jedem Experiment (d. H. Anzahl der Spalten in jeder Reihe) kann unterschiedlich sein. Es gibt auch keine Bedeutung für die Reihenfolge der Ergebnisse in jeder Zeile (das erste Ergebnis in Zeile 1 und das erste Ergebnis 2 sind nicht ähnlicher als jedes andere Paar; dies sind Sätze der Ergebnisse).Was ist eine gute Möglichkeit, Zeile für Zeile in R zu lesen?

Die Datei sieht wie folgt aus etwas:

2141 0 5328 5180 357 5335 1 5453 5325 5226 7 4880 5486 0 
2650 0 5280 4980 5243 5301 4244 5106 5228 5068 5448 3915 4971 5585 4818 4388 5497 4914 5364 4849 4820 4370 
2069 2595 2478 4941 
2627 3319 5192 5106 32 4666 3999 5503 5085 4855 4135 4383 4770 
2005 2117 2803 2722 2281 2248 2580 2697 2897 4417 4094 4722 5138 5004 4551 5758 5468 17361 
1914 1977 2414 100 2711 2171 3041 5561 4870 4281 4691 4461 5298 3849 5166 5578 5520 4634 4836 4905 5105 5089 
2539 2326 0 4617 3735 0 5122 5439 5238 1 
25 5316 21173 4492 5038 5944 5576 5424 5139 5184 5 5096 4963 2771 2808 2592 2 
4963 9428 17152 5467 5202 6038 5094 5221 5469 5079 3753 5080 5141 4097 5173 11338 4693 5273 5283 5110 4503 51 
2024 2 2822 5097 5239 5296 4561 

außer jeder Zeile ist viel länger (bis zu einigen tausend Werte). Wie zu sehen ist, sind alle Werte nicht negative ganze Zahlen.

Um es kurz zu machen - das ist keine normale Tabelle, wo die Spalten Bedeutungen haben. Es ist nur eine Reihe von Ergebnissen - jeder in einer Reihe.

Ich möchte alle Ergebnisse lesen, dann einige Operationen auf jedem Experiment (Zeile), wie die Berechnung der ecdf. Ich möchte auch das durchschnittliche ecdf über alle Wiederholungen berechnen.

Mein Problem - wie soll ich diese seltsam aussehende Datei lesen? Ich bin so zu read.table verwenden, dass ich nicht sicher bin, dass ich jemals etwas anderes versucht habe ... Muss ich einige Low-Level wie readlines verwenden? Ich denke, die bevorzugte Ausgabe wäre eine Liste (oder Vektor?) Von Vektoren. Ich schaute auf scan, aber es scheint, dass alle Vektoren dort die gleiche Länge haben müssen.

Alle Vorschläge werden geschätzt.

UPDATE der folgenden Informationen, das tue ich jetzt so etwas wie dieses:

con <- file('myfile') 
open(con); 
results.list <- list(); 
current.line <- 1 
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) { 
results.list[[current.line]] <- as.integer(unlist(strsplit(line, split=" "))) 
current.line <- current.line + 1 
} 
close(con) 

scheint zu funktionieren. Sieht es OK aus?

Als ich summary(results.list) ich: Länge Klassenmodus

 Length Class Mode 
[1,] 1091 -none- numeric 
[2,] 1070 -none- numeric 
    .... 

Sollte nicht die Klasse integer sein? Und was ist der Modus?

+0

Welche Art von Datei? Könnten Sie ein Beispiel zeigen? –

+0

@Brandon Bertelsen: sicher, siehe aktualisierten Beitrag. –

Antwort

27

Das Beispiel, mit dem Josh verlinkt ist, benutze ich die ganze Zeit.

inputFile <- "/home/jal/myFile.txt" 
con <- file(inputFile, open = "r") 

dataList <- list() 
ecdfList <- list() 

while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) { 
    myVector <- (strsplit(oneLine, " ")) 
    myVector <- list(as.numeric(myVector[[1]])) 
    dataList <- c(dataList,myVector) 

    myEcdf <- ecdf(myVector[[1]]) 
    ecdfList <- c(ecdfList,myEcdf) 

    } 

close(con) 

Ich habe das Beispiel bearbeitet, um zwei Listen aus Ihren Beispieldaten zu erstellen. dataList ist eine Liste, in der jedes Element in der Liste ein Vektor mit numerischen Werten aus jeder Zeile in der Textdatei ist. ecdfList ist eine Liste, in der jedes Element ein ecdf für jede Zeile in Ihrer Textdatei ist.

Sie sollten wahrscheinlich einige try() - oder trycatch() - Logik hinzufügen, um Situationen zu behandeln, in denen der ecdf nicht erstellt werden kann, weil Nullwerte oder ähnliches vorhanden sind. Aber das obige Beispiel sollte dir ziemlich nahe kommen. Viel Glück!

+0

+ 1 Danke! Um die Zeile in einen Vektor von ganzen Zahlen zu konvertieren, verwende ich 'as.integer (unlist (strsplit (oneLine, split =" ")))'. Es funktioniert, aber ich frage mich, ob es einen besseren Weg gibt? Wie würden Sie auch vorschlagen, all diese Vektoren in eine Liste/einen Vektor zu setzen? Beachten Sie auch, dass ich dem OP eine Probe hinzugefügt habe. –

+0

Ich bin mir nicht sicher, ob deine Conversion "besser" ist als meine. Die Methode, die ich benutze, ist eine, auf die ich gestoßen bin, als ich R gelernt habe, und ich habe die schlechte Angewohnheit, ein einzelnes Idiom zu lernen, das funktioniert und dann immer dieses eine Idiom benutzt, auch wenn es einen "besseren Weg" gibt. –

17

Ja, Sie können readLines verwenden. JD Long has a good example, die ich leicht bearbeitet und unten zur Verfügung gestellt habe.

con <- file(inputFile, open = "r") 

while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) { 
    # do stuff 
} 

close(con) 
+2

Schön. Ich habe eine Weile mit der 'While'-Bedingung herumgedreht. Seltsam, dass wir kein 'isEOF()' oder so haben. –

2

Verwenden

line <- readLines(con, 1) 

eine Zeile von Verbindung zu lesen con, die so einfach wie con <- file(filename, "r") sein kann.

5

Oder:

df <- read.delim(file="whatever", header=F, sep = " ") 
1

, wenn Sie wissen, dass die Werte in der Datei ganzen Zahlen sind, können Sie scan() statt readLines() verwenden, sondern auch in einer Schleife:

open(con) 
results.list <- list(); 
current.line <- 1 
while(length(line <- scan(con,what=integer(0),nlines=1,quiet=TRUE))>0) { 
    results.list[[current.line]] <- line 
    current.line <- current.line + 1 
} 
close(con) 

Sie eine bekommen Liste der numerischen Vektoren.

8

Warum die Zeile für Zeile lesen?

results.list <- lapply(strsplit(readLines("myfile")," "), as.integer) 

gibt Ihnen eine Liste von ganzzahligen Vektoren.

über Ihre weiteren Fragen: Nehmen Sie einen Blick auf ?mode (kurz - mode ist für Zahlen numerisch, typeof integer oder doppelt so hoch sein kann, und class numerisch oder integer). Um festzustellen, ob Ganzzahlen vorhanden sind, überprüfen Sie str(results.list) oder lapply(results.list, class).

Verwandte Themen