私の理解が正しければ、「Experiment ...」というパターンで名前が付けられた、それぞれに複数の実験が含まれる一連の CSV ファイルがあります。これらの「実験」のそれぞれを、効率的な方法で R に読み込もうとしています。
これは、それほどきれいではない (しかしそれほど醜くない) 関数であり、正しい方向への出発点となる可能性があります。
関数が基本的に行うことは、CSV を読み取り、新しい実験が始まる行番号を特定し、実験の名前を取得してから、ループを実行して個別のデータ フレームをリストに入力することです。Andrie が指摘したように、「R にはリストを操作するための優れたツールがある」ため、出力をリストに残すことにしました。
read.funkyfile = function(funkyfile, expression, ...) {
temp = readLines(funkyfile)
temp.loc = grep(expression, temp)
temp.loc = c(temp.loc, length(temp)+1)
temp.nam = gsub("[[:punct:]]", "",
grep(expression, temp, value=TRUE))
temp.out = vector("list")
for (i in 1:length(temp.nam)) {
temp.out[[i]] = read.csv(textConnection(
temp[seq(from = temp.loc[i]+1,
to = temp.loc[i+1]-1)]),
...)
names(temp.out)[i] = temp.nam[i]
}
temp.out
}
CSV ファイルの例を次に示します。これをコピーしてテキスト エディターに貼り付け、現在の作業ディレクトリに「funkyfile1.csv」として保存します。(または、Dropbox から読み込みます: http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv )
"Experiment Name: Here Be",,
1,2,3
4,5,6
7,8,9
"Experiment Name: The Dragons",,
10,11,12
13,14,15
16,17,18
これが 2 番目の CSV です。再度、現在の作業ディレクトリに「funkyfile2.csv」としてコピー アンド ペーストして保存します。(または、Dropbox から読み込みます: http://dl.dropbox.com/u/2556524/testing/funkyfile2.csv )
"Promises: I vow to",,
"H1","H2","H3"
19,20,21
22,23,24
25,26,27
"Promises: Slay the dragon",,
"H1","H2","H3"
28,29,30
31,32,33
34,35,36
funkyfile1
には列名がないことに注意してくださいfunkyfile2
。それ...
が関数の引数の目的です: header=TRUE
orを指定しますheader=FALSE
。また、それぞれの新しいデータセットを識別する「式」は、 の「約束」ですfunkyfile2
。
次に、関数を使用します。
read.funkyfile("funkyfile1.csv", "Experiment", header=FALSE)
# read.funkyfile("http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv",
# "Experiment", header=FALSE) # Uncomment to load remotely
# $`Experiment Name Here Be`
# V1 V2 V3
# 1 1 2 3
# 2 4 5 6
# 3 7 8 9
#
# $`Experiment Name The Dragons`
# V1 V2 V3
# 1 10 11 12
# 2 13 14 15
# 3 16 17 18
read.funkyfile("funkyfile2.csv", "Promises", header=TRUE)
# read.funkyfile("http://dl.dropbox.com/u/2556524/testing/funkyfile2.csv",
# "Experiment", header=TRUE) # Uncomment to load remotely
# $`Promises I vow to`
# H1 H2 H3
# 1 19 20 21
# 2 22 23 24
# 3 25 26 27
#
# $`Promises Slay the dragon`
# H1 H2 H3
# 1 28 29 30
# 2 31 32 33
# 3 34 35 36
それらのドラゴンを取りに行きます。
アップデート
データがすべて同じ形式である場合は、lapply
Andrie が言及したソリューションをこの関数と共に使用できます。以下のように、ロードする CSV のリストを作成するだけです。ファイルはすべて、関数が現在書かれている方法と同じ「式」と他の引数を使用する必要があることに注意してください....
temp = list("http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv",
"http://dl.dropbox.com/u/2556524/testing/funkyfile3.csv")
lapply(temp, read.funkyfile, "Experiment", header=FALSE)