5

以下のコードはうまく機能し、私のディレクトリ内のファイルを読み取り、値を抽出しました。

X <- c(75:85) ; Y <- c(208:215) 
extract <- vector()
files <- list.files("C:\\New folder (10)", "*.img",full.names=TRUE)

}

sprintfを使用して指定しようとしましたが、エラーが発生しました。助けてください:

for (i in c(1:365)) {
   fileName <- sprintf("C:New folder (10)/Climate_Rad_%d.img", i)
}
4

4 に答える 4

6

ああ、わかりました、問題はソートにあります。ソート順はアルファベット順です。Climate_Rad_1 のアルファベット順では、Climate_Rad_2 ではなく、Climate_Rad_10 が続きます。この順序は「ランダム」ではなく、アルファベット順です。

ただし、Climate_Rad_2 は、Climate_Rad_10 の後ではなく、Climate_Rad_10 の前に処理する必要があります。それに対処する方法はいくつかあります。最初に、Climate_Rad_002 はアルファベット順で Climate_Rad_010 の前に来ることに注意してください。そのため、ファイルを生成するときに先行ゼロを追加すると、後でファイルを番号順に簡単に処理できます。

あるいは、ファイルの作成時にゼロを追加できなかったとしましょう。次に、ファイルに順番にアクセスするには、少なくとも 2 つの方法があります。後でファイル名にゼロを追加するか、ファイル名の数値部分でソートします。

後者をお見せしましょう。

myFiles <- paste("Climate_Rad_", c(1:15, 95:110), ".img", sep = "") # create some test names, you get the actual myFiles through a call to list.files()

myFiles.sorted <- sort(myFiles) # this gives the alphabetic sorting, not what you want

> myFiles.sorted
 [1] "Climate_Rad_1.img"   "Climate_Rad_10.img"  "Climate_Rad_100.img"
 [4] "Climate_Rad_101.img" "Climate_Rad_102.img" "Climate_Rad_103.img"
 [7] "Climate_Rad_104.img" "Climate_Rad_105.img" "Climate_Rad_106.img"
[10] "Climate_Rad_107.img" "Climate_Rad_108.img" "Climate_Rad_109.img"
[13] "Climate_Rad_11.img"  "Climate_Rad_110.img" "Climate_Rad_12.img" 
[16] "Climate_Rad_13.img"  "Climate_Rad_14.img"  "Climate_Rad_15.img" 
[19] "Climate_Rad_2.img"   "Climate_Rad_3.img"   "Climate_Rad_4.img"  
[22] "Climate_Rad_5.img"   "Climate_Rad_6.img"   "Climate_Rad_7.img"  
[25] "Climate_Rad_8.img"   "Climate_Rad_9.img"   "Climate_Rad_95.img" 
[28] "Climate_Rad_96.img"  "Climate_Rad_97.img"  "Climate_Rad_98.img" 
[31] "Climate_Rad_99.img" 

# split between the part that comes before the numerics and the "1.img" etc.--adjust appropriately
split <- strsplit(myFiles.sorted, "Climate_Rad_") 
# strip the "1.img" etc such that only the numeric part is left
# turn the characters in numeric
split <- as.numeric(sapply(split, function(x) x <- sub(".img", "", x[2])))
# not you can sort, by using order, that gives the original filenames, ordered on the numeric part of the filename
myFiles.correct.order <- myFiles.sorted[order(split)]

 [1] "Climate_Rad_1.img"   "Climate_Rad_2.img"   "Climate_Rad_3.img"  
 [4] "Climate_Rad_4.img"   "Climate_Rad_5.img"   "Climate_Rad_6.img"  
 [7] "Climate_Rad_7.img"   "Climate_Rad_8.img"   "Climate_Rad_9.img"  
[10] "Climate_Rad_10.img"  "Climate_Rad_11.img"  "Climate_Rad_12.img" 
[13] "Climate_Rad_13.img"  "Climate_Rad_14.img"  "Climate_Rad_15.img"   
[16] "Climate_Rad_95.img"  "Climate_Rad_96.img"  "Climate_Rad_97.img" 
[19] "Climate_Rad_98.img"  "Climate_Rad_99.img"  "Climate_Rad_100.img"
[22] "Climate_Rad_101.img" "Climate_Rad_102.img" "Climate_Rad_103.img"
[25] "Climate_Rad_104.img" "Climate_Rad_105.img" "Climate_Rad_106.img"
[28] "Climate_Rad_107.img" "Climate_Rad_108.img" "Climate_Rad_109.img"
[31] "Climate_Rad_110.img"

これにより、探していた順序でファイルが表示されます。それに応じてファイルをプルします。

for (fileNames in myFiles.correct.order) {READ.IN.AND.DO.YOUR.THING}

それはそれを行う必要があります。ファイル名に応じて「Climate_Rad_」と「.img」を調整してください (「Climate_Rad_」の前にパスを追加して、「C:/filefolder/Climate_Rad_」のようにする必要がある場合もあります)。必要)。

于 2012-05-28T18:56:45.043 に答える
5

list.files() を使用して (特定のパターンで) すべてのファイルを取得し、それを並べ替えてみませんか。次に、並べ替えられたベクトルからファイルを取得します。これにより、正しく並べ替えられた順序でファイルが提供されます。これには、1:365 シーケンスから数字が欠落している場合にも機能するという利点があります。

何かのようなもの:

myFiles <- list.files(pattern = "^Climate_Rad_") #all files starting with Climate_
myFiles <- sort(myFiles)
# then read them in, for instance through
for (fileNames in myFiles) {READ.IN.AND.DO.YOUR.MAGIC.ON.THEM}
于 2012-05-27T23:36:00.937 に答える
1

上記のコメントで述べたように、pasteコードを少し単純化するために使用できます。試す:

# set the working directory
setwd("C:New folder (10)")

# construct a vector of file names and loop through
for (f in paste("Climate_Rad_", 1:365, ".img", sep="")) {
    conne <- file(f, "rb")
    # do rest, assuming it's correct
}
于 2012-05-27T21:34:34.487 に答える