1

開いてデータに対していくつかの機能を実行したい96個のファイルのリストがあります。私はRに非常に慣れていないので、文字列を操作してシーケンシャルファイル名を開く方法がわかりません。これが私のコードですが、明らかに機能しません:

for (N in (1:96)){
  if (N > 10) 
      TrackID <- "000$N"
  }
  else{
      TrackID <- "00$N"
  }

  fname_in <- 'input/intersections_track_calibrated_jma_from1951_$TrackID.csv'
  fname_out <- 'output/tracks_crossing_regional_polygon_$TrackID.csv'

  ......data manipulations.....

}

したがって、基本的には、たとえばN = 1の場合、intersections_track_calibrated_jma_from1951_0001.csvというファイルを参照できる必要があります。

前もって感謝します!

キンバリー

4

2 に答える 2

1

あなたが探しているのはsprintf()関数だ
sprintfと思います... n のテストから解放され、先行ゼロがいくつ必要かがわかります。paste()またはpaste0
関数 と組み合わせると、目的のファイル名を生成するのがワンライナーになります。 実際、sprintf() 関数を単独で使用することもできますが、ファイル名や「TrakID」を生成する関数を使用すると、これらすべてのファイル命名規則の詳細を隠すことができます。

sprintf("intersections_track_calibrated_jma_from1951_%04d.csv", n)

以下では、数値 n を指定してファイル名を生成するために作成された便利な関数のコンテキストで、sprintf() と paste0() の動作を参照してください。

> GetFileName <- function(n) 
    paste0("intersections_track_calibrated_jma_from1951_",
           sprintf("%04d", n),
           ".csv")

> GetFileName(1)
[1] "intersections_track_calibrated_jma_from1951_0001.csv"
> GetFileName(13)
[1] "intersections_track_calibrated_jma_from1951_0013.csv"
> GetFileName(321)
[1] "intersections_track_calibrated_jma_from1951_0321.csv"
> 

もちろん、パラメーターを追加することで、GetFileName 関数をより用途の広いものにすることができます。その一部には既定値が設定されています。その方法では、入力と出力の両方のファイル名 (またはその他のファイルのプレフィックス/拡張子) に使用できます。例えば:

GetFileName <- function(n, prefix=NA, ext="csv") {
   if (is.na(prefix)) {
      prefix <- "intersections_track_calibrated_jma_from1951_"
   }

   paste0(prefix, sprintf("%04d", n), ".", ext)
}
> GetFileName(12)
[1] "intersections_track_calibrated_jma_from1951_0012.csv"
> GetFileName(12, "output/tracks_crossing_regional_polygon_", "txt")
[1] "output/tracks_crossing_regional_polygon_0012.txt"
> GetFileName(12, "output/tracks_crossing_regional_polygon_")
[1] "output/tracks_crossing_regional_polygon_0012.csv"
> 
于 2012-11-07T16:57:54.880 に答える
0

代わりに and を使用して、このような文字列を生成pasteしてみてください。paste0

for (N in (1:96)){
  if (N > 10) 
      TrackID <- paste0("000",N)
  }
  else{
      TrackID <- paste0("00",N)
  }

  fname_in <- paste0('input/intersections_track_calibrated_jma_from1951_', 
                     TrackID.'.csv')
  fname_out <- paste0('output/tracks_crossing_regional_polygon_',
                      TrackID,'.csv')

  ......data manipulations.....

}

paste0sep=""(あなたの場合のように)区切り記号が必要ない場合は、書く手間を省くだけです

于 2012-11-07T16:50:11.743 に答える