2010-09-04 12 views
5

Ich bin gewohnt, Perl und neu zu R. Ich weiß, dass Sie ganze Tabellen mit read.table() lesen können, aber ich frage mich, wie kann ich R verwenden, um eine einzelne Zeile aus einer Eingabedatei zu analysieren.Grundlegende Eingabe Dateianalyse in R

Insbesondere was ist das Äquivalent zu dem folgenden Perl-Schnipsel:

open my $fh, $filename or die 'can't open file $filename'; 
my $line = <$fh>; 
my ($first, $second, $third) = split ("\t", $line); 

Antwort

3

ähnlich wie die oben wäre:

filename <- 'your/file/name/here' 
fh <- file(filename, open='rt') 
line <- readLines(fh, n=1) 
tmp <- strsplit(line, "\\t") 
first <- tmp[[1]][1]; second <- tmp[[1]][2]; third <- tmp[[1]][3] 

Die Datei Funktion eine Verbindung zur Datei erstellt und öffnet es, die Öffnung ist optional, aber wenn Sie öffne die Datei nicht, wenn du sie liest, öffnet sie sich und schließt die Datei wieder. Wenn du die Datei öffnest, bleibt sie offen und der nächste Lesevorgang wird fortgesetzt von dem Punkt, an dem die vorherige links war (am ehesten passend zu dem, was Perl tun würde) über).

Die readLines-Funktion liest die angegebene Anzahl von Zeilen (1 in diesem Fall) dann funktioniert strsplit im Grunde das gleiche wie die Perl-Split-Funktion.

R hat nicht die Mehrfachbelegung wie Perl (es ist oft am besten, die Ergebnisse nur zusammen zu halten, anstatt sich in mehrere globale Variablen aufzuteilen).

+0

Eine Warnung - dies würde die gesamte Datei in den Speicher laden und alle ihre Zeilen aufteilen. Wenn die Datei riesig ist und Sie nur die ersten drei Elemente benötigen, ist dies sicherlich keine gute Idee. – mbq

+0

Für eine kleine Datei kann es die ganze Sache lesen, aber für größere Dateien liest es nur einen Teil in den Speicher, während Sie fortfahren, von der Datei zu lesen, wird es zusätzliche Stücke ergreifen. –

1

In der Regel sollten Sie scan, dies zu tun, oder in komplexeren Fällen lesen Sie die gesamte Datei mit readLines und analysieren es manuell mit strsplit s, grep s und so.

In Ihrem Fall:

scan(filename,character(0),nmax=3)->d 
first<-d[1];d[2]->second;third<-d[3] 
0

nur eine andere Art zu zeigen, es zu tun (vorausgesetzt, Ihre Eingabe ist „temp/3.txt“):

> d <- read.csv("temp/3.txt", sep="\t", stringsAsFactors=F, header=F, nrows=1) 
# Show the default column names: 
> colnames(d) 
[1] "V1" "V2" "V3" 
# Assign the requested column names 
> colnames(d) <- c("first", "second", "third") 
# Show the current structure of d 
> d 
    first second third 
1  1  2  3 
# Probably not recommended: Add the columns of d to the search path 
> attach(d) 
> first 
[1] 1 
# Clean up: 
> detach(d) 

ich den wichtigsten Teil erraten oben in Bezug auf Ihre Frage Adressierung nur

nrows=1 

die es teilt eine Zeile der Eingabe zu analysieren. (Unterhalb von read.csv wird zum Scannen nach unten gerufen.)