0
>titletool<-read.csv("TotalCSVData.csv",header=FALSE,sep=",")

> class(titletool)
[1] "data.frame"

>titletool[1,1]
[1] Experiment name : CONTROL DB AD_1

>t<-titletool[1,1]

>t
[1] Experiment name : CONTROL DB AD_1

>class(t)
[1] "character"

今、私は「実験名:CONTROL DB AD_1」という名前のオブジェクト(ベクトル)を作成したい、または可能であればCONTROL DB AD_1

ありがとうございました

4

2 に答える 2

1

使用assign

varname <- "Experiment name : CONTROL DB AD_1"

assign(varname, 3.14158)
get("Experiment name : CONTROL DB AD_1")
[1] 3.14158

また、正規表現を使用しsubたりgsub、文字列からテキストを削除したりできます。

cleanVarname <- sub("Experiment name : ", "", varname)
assign(cleanVarname, 42)
get("CONTROL DB AD_1")
[1] 42

しかし、これは珍しいことです。

ここにドラゴンがいます。

于 2012-07-17T15:21:00.890 に答える
1

私の理解が正しければ、「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=TRUEorを指定します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

それらのドラゴンを取りに行きます。

アップデート

データがすべて同じ形式である場合は、lapplyAndrie が言及したソリューションをこの関数と共に使用できます。以下のように、ロードする 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)
于 2012-07-17T20:03:49.070 に答える