1

私は R でのプログラミングを始めて 1 週間目で、特定の問題の解決に関して大きな進歩を遂げましたが、より大規模なアドバイスが必要です。

CSV 形式のデータ ファイルでいっぱいのディレクトリがあります。ファイル名は、データ ソースを明確に識別します。データをインポートし、さまざまな計算によってデータを調整し、各ファイルの調整の結果を分析とレビューのために保持する必要があります。私は、個々のファイル単位でデータを開いて広範な調整を行うことを首尾よく学びました。条件付けにより、複数の計算出力が得られます。このプロセスを自動化し、それぞれのファイル名に基づいて結果に動的に名前を付ける必要があります。

データの条件付けは各ファイルで同じなので、ファイルごとに呼び出すことができる関数を作成しました。関数は、関数の実行後に消える独自の環境で動作することを理解しています。貼り付けを使用して変数に動的に名前を付けて名前を作成し、割り当てて結果をそれらの名前に割り当てることができますこれらの割り当ては、関数が閉じられると失われます。

すべてのファイルをステップ実行し、すべての個々の計算結果をワークスペースで利用できるようにするための最適な方法については確信が持てません。関数の出力を、後でインデックス付けできる単一のリストに書き込む「はず」であることはわかっています。ただし、数百の計算結果があり、後で索引付けが複雑になります。ファイルのうちの 2 つに、異なる場所での気温測定値が含まれているとします。わかりやすいファイル名に基づいて計算結果に動的に名前を付けているため、結果を Temperature.Air.Location1 および Temperature.Air.Location2 として保存できます。大きなリストの対応するインデックスを検索するのではなく、Temperature.Air.Location1 - Temperature.Air.Location2 と入力するだけで、後で温度デルタを計算できる機能が非常に気に入っています。

これを達成するためのエレガントな方法があると確信していますが、R での関数、補間、およびプロットについて学ぶことに夢中になり、大局。どんなアドバイスでも大歓迎です。

編集してサンプルコードを追加 関数のこの部分では、テーブルを x、y、z 座標に変換し、値を補間しています。

CalibrationImport.Table <- function(filename, parametername, xmin, xmax, ymin, ymax){
  Path.File <- paste0(Path.Folder,filename)
  assign(parametername, read.csv(Path.File, header = FALSE))

  # Extract x coordinates from original table
  assign(paste0(parametername,".x"), get(parametername)[1, ])
  assign(paste0(parametername,".x"), unlist(get(paste0(parametername,".x"))[-1], use.names=FALSE))
  assign(paste0(parametername,".x"), c(t(replicate(nrow(get(parametername))-1, get(paste0(parametername,".x"))))))

  # Extract y coordinates from original table
  assign(paste0(parametername,".y"), get(parametername)[ ,1])
  assign(paste0(parametername,".y"), unlist(get(paste0(parametername,".y"))[-1], use.names=FALSE))
  assign(paste0(parametername,".y"), c(replicate(ncol(get(parametername))-1, get(paste0(parametername,".y")))))

  # Extract data for original table
  assign(paste0(parametername,".z"), unlist(get(parametername)[-1, -1], use.names=FALSE))

  # Interpolate 100x100 surface
  assign(paste0(parametername,".i"), interp(get(paste0(parametername,".x")), get(paste0(parametername,".y")), get(paste0(parametername,".z")),
                                        xo=seq(xmin, xmax, length=100), yo=seq(ymin, ymax, length=100)))
}
4

2 に答える 2

4

assign 関数内では使用せず、関数assignの結果に対して外部で使用します。

 `assign( "name1" , myfunc(x) )`

CSV ファイルのディレクトリに適用する場合は、次のようなことができます。

fl <- list.files( "path/to/my/directory" , pattern = ".csv" )

for( i in 1: length(fl) ){      
  assign( paste0( "file." , i ) , myfunc( fl[i] ) )
}

これはループの古典的な使用法の 1 つで、for副作用のためにループを適用します。

ただし、何百ものファイルがあるため、lapply結果がリストで返され、構文が非常に単純な の方がよい場合があります。

myresults <- lapply( fl , myfunc )

ただし、関数の一部を書き直して、何も割り当てないようにする必要がある場合がありますが、代わりに保持したい値を返します。代入 (すなわち<-) を使用して、ワークスペース内のオブジェクトに戻り値を配置します。再現可能な例がなければ、これは大まかなスケッチにすぎません。

ファイルの名前を保持したい場合は、sapplyより良いかもしれません。結果をベクトルとして返し、名前を保持できます。

sapply( fl , myfunc , USE.NAMES = TRUE )
于 2013-05-03T11:07:15.973 に答える