2012-11-07 75 views
1

我有一個96個文件的列表,我想在數據上打開並執行一些功能。我對R非常陌生,我不確定如何操作字符串來打開順序文件名。這裏是我的代碼下面,這顯然不工作: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文件。

在此先感謝!

金佰利

回答

0

嘗試使用pastepaste0產生這樣的字符串代替。

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..... 

} 

paste0只是節省你寫sep="",如果你不需要分隔符(如你的情況)

+0

嗯我有問題的paste0函數。我需要一個特殊的圖書館來使用它嗎? – kimmyjo221

+0

@ user1716877不,但您確實需要一個最新的R.將'paste0(foo)'更改爲'paste(foo,sep =「」)'以獲得類似結果的老版本R. –

+0

它是pasteZERO而不是pasteOH。你使用什麼版本的R?我認爲這已經持續了一年,至少... –

1

我認爲你正在尋找的是sprintf()功能...
sprintf將使您無法在n上進行測試,知道需要多少前導零。
結合paste() or paste0函數,生成所需的文件名將成爲一行。
事實上,它可能只是單獨使用sprintf()函數,如
sprintf("intersections_track_calibrated_jma_from1951_%04d.csv", n),但具有生成文件名和/或「TrakID」的函數可以允許隱藏所有這些文件命名約定細節。

下面,請參閱sprintf()和paste0()在創建便利函數的上下文中,以生成給定數字n的文件名。

> 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" 
> 
+0

+1 sprintf()是一個更清潔的解決方案。 –