2012-01-04 15 views
1

私はRでこれをしたい:ベクトルは、データ構造に属している別のベクトルに各ファイルの内容を読み取ろうとRのPythonリストの理解?

fsC=[read.table(x) for x in Sys.glob('./Trial7/*.csv')] 

すなわち。

Pythonの

[file(x, 'r').read() for x in glob.glob('./Trial7/*.csv')] 

またはより良い実際

[file(x, 'r') for x in glob.glob('./Trial7/*.csv')] 

が、私は、あなたがポイントだと思います...

+0

パスに「./」は必要ありません。 Rは現在の作業ディレクトリを基準にして表示する必要があります。 –

答えて

5

利用ベクトルを "マップ" するsapply:

sapply(Sys.glob('./Trial7/*.csv'), read.table) -> fsc 
+0

...この種のパズルはどうですか? 'data.frame(Sys.glob( './ Trial7/*。csv')、Sys.glob( './Trial7/ *。csv')) - > y; sapply(y、read.table) '、いくつかの結合が必要ですか?マージが遅すぎる...もっと複雑な構造ではどうすれば使えますか? Python '[...]'は、そこのキラーです... – hhh

+0

... 'sapply(Sys.glob( './ Trial7/*。csv')、read.table) - > fsc; [log(x [2])for x in fsC] 'では、Rの中でどのようにすることができますか? – hhh

+0

それぞれの場合の戻り値は 'data.frame'ですので、出力をベクトルに単純化することはできません。したがって、' sapply'はここで 'lapply'と同じことを返します。 –

7

ここには2つの質問があります。最初に、 "ファイル名のベクトルを与えられたら、それらのファイルをRにどのように読み込むのですか?"

ここで先に述べたように、ファイル名

trial7_files <- Sys.glob("Trial7/*.csv") 
#if you prefer to specify the names using regular expressions, try 
trial7_files <- dir("Trial7", "\\.csv$") 

のリストは、だlapplyは、ファイルの読み込みの最良の方法です。

fsC <- lapply(trial7_files, read.csv) 

これはデータフレームのリストを表示し、次の質問につながります。 「どのようにして同じ列のデータフレームのリストを1つのデータフレームに結合しますか?」

標準的な方法は、do.callrbindです。まず、各データセットにある行の数をメモすると便利です。

n_records <- sapply(fsC, nrow) 
fsC <- do.call(rbind, fsC) 

あなたの問題は解決しましたが、おそらく各行がどのファイルから来たのかを示す列が必要です。

fsC$source <- rep(trial7_files, n_records) 
+0

+1、データソースに関する情報を追加するには、行:names(trial7_files)< - trial7_filesを追加します。名前はdata.frameのrownamesに取り込まれます。 –

+0

@WojciechSobala:ええ、私はそれから始めましたが、それらのrownamesには(各ソースごとに同じ値ではなく)番号が付けられています。ソースを要素として持つ方が便利だと思いました。 –

+0

'一致のエラー。 名前は前の名前と一致しません 呼び出し:do.call - > - > rbind - > match.names'の 'fsC hhh