2010-10-14 9 views
60

Ich schreibe ein R-Paket, wo der R-Code mit einer Java-Anwendung spricht. Die Java-Anwendung gibt eine CSV-formatierte Zeichenfolge aus, und ich möchte, dass der R-Code die Zeichenfolge direkt lesen und in ein dat.frame konvertieren kann.Gibt es eine Möglichkeit, read.csv zum Lesen von einem Zeichenfolgenwert anstelle einer Datei in R zu verwenden?

+0

Könnten Sie das rjava Paket stattdessen verwenden? –

+0

Vielleicht könnten Sie mit allowEscapes (in read.table) herumspielen. Stellen Sie nur sicher, dass die Java-Ausgabe \ n verwendet, um Zeilen zu brechen. –

+0

@Joshua Ich benutze rJava, um mit meinem Java-Programm zu sprechen. Ich denke, es ist effizienter, meine schwergewichtigen Java-Objekte zuerst in Strings umzuwandeln, bevor sie in R übergeben werden. –

Antwort

82

Ja, für textConnection() auf Hilfe finden - der sehr mächtig Begriff in R ist, dass im Wesentlichen alle Leser (wie zB read.table() und seine Varianten) Zugriff auf dieses Verbindung Objekt, das eine Datei oder einen Remote sein kann URL oder eine Pipe, die von einer anderen App kommt, oder ... ein Text wie in Ihrem Fall.

Der gleiche Trick ist für so genannte hier Dokumente verwendet:

> lines <- " 
+ flim,flam 
+ 1.2,2.2 
+ 77.1,3.14 
+ " 
> con <- textConnection(lines) 
> data <- read.csv(con) 
> close(con) 
> data 
    flim flam 
1 1.2 2.20 
2 77.1 3.14 
> 

Beachten Sie, dass dies für den Aufbau etwas ein einfache Weg ist, aber es ist auch teuer aufgrund der wiederholten Analyse der alle Daten. Es gibt andere Wege, um von Java zu R zu gelangen, aber das sollte Sie schnell voranbringen. Effizienz als nächstes kommt ...

eine 7-jährige Antwort bearbeiten: Inzwischen ist dies viel einfacher dank der text= Argument, das zu read.csv() und gleich hinzugefügt:

R> data <- read.csv(text="flim,flam 
+ 1.2,2.2 
+ 77.1,3.14") 
R> data 
    flim flam 
1 1.2 2.20 
2 77.1 3.14 
R> 
+8

Neuere R-Versionen haben einen einfacheren Mechanismus, siehe die Antwort von @Adam Bradley in diesem Thread: http://Stackoverflow.com/a/16349171/17523 –

4

Ja. Zum Beispiel:

string <- "this,will,be\na,data,frame" 
x <- read.csv(con <- textConnection(string), header=FALSE) 
close(con) 
#> x 
# V1 V2 V3 
#1 this will be 
#2 a data frame 
1

Angenommen, Sie eine Datei namens tommy.csv haben (ja, einfallsreich, ich weiß ...), die den Inhalt von

col1 col2 \ n 1 1 \ n 2 hat 2 \ n 3 3

wobei jede Zeile durch ein Escapezeichen "\ n" getrennt ist.

Diese Datei kann mit Hilfe von allowEscapes Argument in gelesen werden.

> read.table("tommy.csv", header = TRUE, allowEscapes = TRUE) 

    col1 col2 
1 col1 col2 
2 1 1 
3 2 2 
4 3 3 

Es ist nicht perfekt (Spaltennamen ändern ...), aber es ist ein Anfang.

0

Mit dieser Funktion wird die Antwort von Dirk in eine bequeme Form gebracht. Es ist großartig, wenn man Fragen zu SO beantwortet, wo der Fragesteller die Daten gerade auf den Bildschirm geworfen hat.

text_to_table <- function(text, ...) 
{ 
    dfr <- read.table(tc <- textConnection(text), ...) 
    close(tc) 
    dfr 
} 

Um es zu verwenden, kopieren Sie zuerst die Bildschirmdaten und fügen Sie sie in Ihren Texteditor ein.

foo bar Baz
1 2 a
3 4 b

Nun ist es mit text_to_table wickeln, Zitate und irgendwelchen anderen Argumente für read.table.

text_to_table("foo bar baz 
1 2 a 
3 4 b", header = TRUE) 
70

Beachten Sie, dass in nun aktuellen Versionen von R, die Sie nicht mehr die textConnection() benötigen, dann ist es möglich, dies zu tun einfach:

> states.str='"State","Abbreviation" 
+ "Alabama","AL" 
+ "Alaska","AK" 
+ "Arizona","AZ" 
+ "Arkansas","AR" 
+ "California","CA"' 
> read.csv(text=states.str) 
     State Abbreviation 
1 Alabama   AL 
2  Alaska   AK 
3 Arizona   AZ 
4 Arkansas   AR 
5 California   CA 
+5

Ich weiß, das ist ein bisschen spät, aber - vielleicht könnte es nützlich sein um dies als Bearbeitung der akzeptierten Antwort einzureichen, da es unwahrscheinlich ist, dass das OP jetzt die angenommene Antwort ändern wird, doch scheint dies jetzt die bessere Antwort zu sein? – obfuscation

+1

IMHO sollte der OP die akzeptierte Antwort inakzeptabel akzeptieren und diese akzeptieren ... – Mischa

Verwandte Themen