2016-11-17 4 views
0

私はRのラスターを使って作業しています。それらのデータを座標から正確に抽出しています。しかし、私の問題は実際にラスタと一緒に働いているわけではなく、いつでも私が仕事をしたいと思っている特定のラスタで読むことと同じです。Rのファイル名に基づいてラスターのサブセットを読み込む

私は35年分のラスタデータを持っていますが、各ラスタの名前はその日付を反映しています。例: "raster.01.01.1990.tif"

すべてのラスタは1つのフォルダにあります。時々、すべてのラスタからデータを抽出する必要があります。その場合は、まっすぐです。 wdを設定し、ラスタのリストを作成し、それらのラスタをRに読み込みます。

setwd("C:/Users/User/Folder/Rasters") 
f <- list.files(getwd()) 
ras <- lapply(f,raster) 

問題はありません。私は次に私がする必要があることをすることができます。しかし、時には私はほんの数年しか働かないことがあります。その場合、ファイル名に私が望ましくない年が含まれているかどうかに基づいて、ファイルリストから特定のラスタを除外しています。

setwd("C:/Users/User/Folder/Rasters") 
f <- list.files(getwd()) 
# Choose years to exclude, e.g 2010, 2015, and 2016 
f <-f[lapply(f,function(x)length(grep("2010|2015|2016",x,value=FALSE)))==0] 
ras <- lapply(f,raster) 

このアプローチは機能します。しかし、私はおそらくもっと優雅な解決策があると感じるのを助けることができません。特に、3年間のデータで作業したい場合は、32年分のデータを手動で除外する必要があります。確かにそれはそのが長いと取ることはありません...しかしそれは非効率です。

上記の方法よりもファイル名に基づいてファイルを除外またはインクルードする方が効率的ですか?

ありがとうございました!

答えて

0

list.files()のpattern引数を使用して、必要なものと不要なものをフィルタします。その正規表現

# without any regex 
list.files(path = "D:/xxx/", pattern = ".csv") 
[1] "my_2015.csv" "my_2016.csv" "my_2017.csv" 

# excluding those files having 2016 or 2017 in their names 
list.files(path = "D:/xxx/", pattern = "[^2016|2017].csv$") 
[1] "my_2015.csv" 
+0

改善をありがとう。これは計算上より効率的ですが(私は推測していますが)、別の年を除外するたびにコードを手動で変更していることを意味します。 (公平には、これはおそらく私の部分の設計上の瑕疵であり、私の問題点について十分に説明していない)。 – Savi

+0

@Saviはあなたの質問に答えますか? http://stackoverflow.com/help/someone-answersに続く心 –

0

ファイル名をファイル名、年月日、そしておそらくDateの値を含むdata.frameの行に変換する関数を記述します。その場合、選択は簡単かつエレガントに行うことができます。

+0

これは単純な質問ですが、あれば私は申し訳ありません:右、まだ新しい行で、元のファイル名をマップするDFの行にファイル名を変換しますか?したがって、raster.01.01.1990.tifが_row:1 | 1990 | Jan | 01_ラスタとして「行1」を読み込むための後のコマンドは、元のラスタ01.01.1990.tifを取得しますか? – Savi

関連する問題