web-dev-qa-db-ja.com

read.csvを使用してRのファイルではなく文字列値から読み取る方法はありますか?

RコードがJavaアプリケーションと通信するRパッケージを作成しています。JavaアプリケーションはCSV形式の文字列を出力し、Rコードに文字列を直接読み取り、data.frameに変換できること。

74
tommy chheng

7歳の回答の編集:今では、これはmuchですread.csv()などに追加されたtext=引数により、より簡単になりました。

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> 

はい。textConnection()のヘルプをご覧ください。Rの非常に強力な概念は、本質的にすべての読者(たとえばread.table()およびそのバリアント)は、これらのconnectionオブジェクトにアクセスします。オブジェクトは、ファイル、リモートURL、または別のアプリからのパイプである場合があります。または...あなたの場合のようなテキスト。

同じトリックがいわゆるヒアドキュメントに使用されます:

> 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
> 

これは何かを構築するためのsimple方法ですが、costlyすべてのデータの解析が繰り返されるため。 JavaからRに到達する方法は他にもありますが、これにより迅速に作業を開始できます。次に効率が向上します...

104

Rの現在のバージョンでは、textConnection()が不要になったことに注意してください。これは簡単に行うことができます。

> 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
77
Adam Bradley

はい。例えば:

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
4
Joshua Ulrich

Tommy.csv(はい、想像力があります、私は知っています...)というファイルがあり、その内容が

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

各行はエスケープ文字「\ n」で区切られています。

このファイルは、read.tableallowEscapes引数を使用して読み取ることができます。

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

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

それは完全ではありません(列名を変更します...)が、それは始まりです。

1
Roman Luštrik

この関数は、Dirkの答えを便利な形式にラップします。質問者が画面にデータをダンプしたばかりのSOに関する質問に答えるのは素晴らしいことです。

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

これを使用するには、まず画面上のデータをコピーして、テキストエディターに貼り付けます。

foo bar baz
1 2 a
3 4 b

text_to_table、引用符、およびread.tableの他の引数でラップします。

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