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


82

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


代わりにrJavaパッケージを使用できますか?
Joshua Ulrich

たぶん、allowEscapes(read.table内)をいじることができます。Java出力が\ nを使用して行を区切りていることを確認してください。
ローマLuštrik

@Joshua私はrJavaを使用してJavaプログラムと通信しています。私はそれが最初R.にそれを渡す前に、文字列に私の重いJavaオブジェクトに変換するために、より効率的だと思う
トミーchheng

トミー、サイモンがrJavaに入れたものよりも手動シリアル化の方が効率的だと思う理由は何ですか?これのいずれかをベンチマークしましたか?
Dirk Eddelbuettel 2010年

1
多分効率的は間違った言葉です。私の入力はハッシュマップのようなオブジェクトの配列であり、私の出力はRdata.frameです。rJavaには、Javaオブジェクトをdata.frameとして表すことができるものが何も見当たらなかったので、オブジェクトを文字列にフォーマットしてから、Rdata.frameに変換します。これに対処するためのより効率的な提案をいただければ幸いです。
tommy chheng 2010年

回答:


117

7年前の回答の編集: これまでに、追加された引数のおかげで、これははるかに簡単text=read.csv()なりました。

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()、その変種)はアクセスこれらの接続ファイル、またはリモートの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
> 

これは何かを構築するための簡単な方法ですが、すべてのデータの解析が繰り返されるため、コストかかることに注意してください。JavaからRに移行する方法は他にもありますが、これですぐに作業を進めることができます。次に効率が来る...


8
最近のRバージョンのメカニズムは単純です。このスレッドの@AdamBradleyによる回答を参照してください:stackoverflow.com/a/16349171/17523
Boris Gorelik

79

現在のバージョンの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

5
これ自体が少し遅れていることは知っていますが、OPが受け入れられた回答を変更する可能性は低いため、受け入れられた回答の編集としてこれを送信すると便利な場合がありますが、これはより良い回答のように見えますか?
難読化

1
私見、OPは受け入れられた答えを受け入れず、これを受け入れるべきです...
Mischa 2016

4

はい。例えば:

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

tommy.csvというファイルがあり(そう、想像力に富んでいる、私は知っている...)、次の内容が含まれているとします。

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

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

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

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

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

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


1

きちんとしたアプローチを使用して、テキスト値を指定するだけです

library(readr)
read_csv(file = "col1, col2\nfoo, 1\nbar, 2")
# A tibble: 2 x 2
 col1   col2
 <chr>  <dbl>
1 foo       1
2 bar       2

0

この関数は、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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.