13

私の状況

  1. .csvより前に同じサフィックスが付いたcsvファイルがいくつかありますが、ファイル名の最初の2文字が異なります(AA01.csv、AB01.csv、AC01.csvなど)。
  2. 各ファイルで実行したいRスクリプトがあります。このファイルは、基本的に.csvからデータを抽出し、それらをベクトルに割り当てたり、時系列オブジェクトに変換したりします。(たとえば、AA01 xts時系列オブジェクト、AB01 xtsオブジェクト)

私が達成したいこと

  1. スクリプトをより大きなループ内に(または必要に応じて)埋め込み、各ファイルを順番に実行してスクリプトを適用します
  2. 作成された中間オブジェクトを削除します(以下のコードスニペットを参照)
  3. 各生データファイルから作成された最終的なxtsオブジェクト(つまり、AA01からAC01などの値/ベクトルなど)を残してください

このスクリプトをRに埋め込む正しい方法は何でしょうか?申し訳ありませんが、私はプログラミング初心者です!

以下の私のスクリプトコード...各CSVの各列の見出しはDATE、TIME、VALUEです

    # Pull in Data from the FileSystem and attach it
AA01raw<-read.csv("AA01.csv")
attach(AA01raw)
#format the data for timeseries work
cdt<-as.character(Date)
ctm<-as.character(Time)
tfrm<-timeDate(paste(cdt,ctm),format ="%Y/%m/%d %H:%M:%S")
val<-as.matrix(Value)
aa01tsobj<-timeSeries(val,tfrm)
#convert the timeSeries object to an xts Object
aa01xtsobj<-as.xts(tsobj)
#remove all the intermediate objects to leave the final xts object
rm(cdt)
rm(ctm)
rm(aa01tsobj)
rm(tfrm)
gc()

次に、すべてのxtsオブジェクトが抽出されるまで、各.csvファイルで繰り返します。

つまり、R内で最終的には、次のアプリケーションの準備ができています。

aa01xtsobj, ab01xtsobj, ac01xtsobj....etc

これを行う方法についての助けをいただければ幸いです。

4

2 に答える 2

24

dir手動でファイル名を入力するのではなく、必ずRsコマンドを使用してファイル名のリストを作成してください。

filenames = dir(pattern="*01.csv")
for( i in 1:length(filenames) )
{
  ...
于 2011-04-27T04:23:10.087 に答える
11

私はforループを見つけ、リストはこのようなものには十分です。ワーキングセットのコードができたら、ループからsapplyiedまたは同様の関数に移動するのは簡単ですが、そのようなベクトル化はとにかく特異であり、プライベートワンライナーの外ではおそらく役に立ちません。

ワークスペース内で異なる名前の複数のオブジェクトに割り当てることは避けたいと思うかもしれません(これは通常、「どのように割り当てる()。。。。」として表示されるFAQです)。

テストされていないコードに注意してください。

ファイル名のベクトル、および各ファイルの名前付き要素のリスト。

files <- c("AA01.csv", "AA02.csv")
lst <- vector("list", length(files))
names(lst) <- files

各ファイルをループします。

library(timeSeries)

for (i in 1:length(files)) {
    ## read strings as character
    tmp <- read.csv(files[i], stringsAsFactors = FALSE)
    ## convert to 'timeDate'
    tmp$tfrm <- timeDate(paste(tmp$cdt, tmp$ctm),format ="%Y/%m/%d %H:%M:%S"))
    ## create timeSeries object
    obj <- timeSeries(as.matrix(tmp$Value), tmp$tfrm)
    ## store object in the list, by name
    lst[[files[i]]] <- as.xts(obj)
}

## clean up
rm(tmp, files, obj)

これですべての読み取りオブジェクトがにlstなりましたが、ファイルが使用可能であり、正しく読み取られたことをテストする必要があります。また、ファイル名だけでなく、よりわかりやすい名前に変更することもできます。

リストから名前インデックスで最初のオブジェクトを印刷します。

lst[[files[1]]]
于 2011-04-27T03:58:26.930 に答える