-1

Rのループでファイル名を変数として処理する際に問題があります

files <- list.files(pattern = "*.tab",full.name=T)
for (a in files) { aname <- strsplit(basename(a), "\\.")[[1]][1]
                   aname <- read.table(a,header=TRUE, sep="\t",comment.char="")
                }

aname以下を使用する場合、オブジェクトは 1 つだけ生成されます。

for (a in files) { c(strsplit(basename(a), "\\.")[[1]][1]) <- read.table(a,header=TRUE,
                        sep="\t",comment.char="")
                }

関数 "c<-" が見つかりませんでした。でももしそうなら

for (a in files) { aname <- strsplit(basename(a), "\\.")[[1]][1]
                   print(aname)
                }

出力は、予想どおり、拡張子のないファイルのリストです。問題は、関数の結果を変数名にするにはどうすればよいかということです。ありがとうございました!

4

1 に答える 1

6

問題はファイル名の処理ではなく、ループの書き方にあります。基本的にあなたがやっている:

for(i in list.of.files) {
  foo <- processName(i)
  foo <- read.table(foo)
}

そのように見ると、ループの反復ごとに が 2 回書き込まれるため、最後の呼び出しfooの値しか取得できないことが明らかです。read.table()

やりたいことは、ループに入る前にファイルのリストにストレージを割り当て、次にそのリストに入力することです。例えば:

aname <- vector("list", length = length(files))
fnames <- character(length(files))
for(i in seq_along(aname)) {
  fnames[i] <- strsplit(basename(files[i]), "\\.")[[1]][1]
  aname[i] <- read.table(a, header=TRUE, sep="\t", comment.char="")
}
names(aname) <- fnames

リストに含まれるオブジェクトを持つことは便利な機能であるため、それらすべてのオブジェクトがぶらぶらしているわけではありません。それらはリスト内に含まれているため、lapply()または同様のものを使用して各オブジェクトを操作できます。

すべてのファイルの名前として拡張子のないファイル名を持つ個々のオブジェクトが本当に必要な場合は、を使用できますがassign()、お勧めしません

files <- list.files(pattern = "*.tab", full.name=TRUE)
for (a in files) {
  aname <- strsplit(basename(a), "\\.")[[1]][1]
  assign(aname, read.table(a, header=TRUE, sep="\t", comment.char="")
}

詳細については、を参照?assignしてください。

于 2012-11-14T21:54:05.510 に答える