2

[365のバイナリファイル][1]があります。月平均を計算したい。したがって、365ファイルから、

このコードは、30ファイルごとに平均を取ります。

results <- list()
for (.files in files.group) {
      x <- do.call(rbind,(lapply(.files, readBin  , double() , size = 4, n =360 * 720, 
                 signed =T)))
          results[[length(results) + 1L]] <- colMeans(x)
    }

私は次のアイデアに感謝します:

4

1 に答える 1

4
dir1 <- "C:\\New folder (4)\\New folder"
files <- list.files(dir1, "*.bin",full.names=TRUE)

まず、ファイルの番号を抽出する必要があります(つまり、「ET10.bin」は「ET9.bin」ではなく「ET1.bin」の後にあります)。

step1 <- strsplit(gsub("\\.bin","",files),split="ET")
filenumber <- do.call(rbind,step1)[,2]

その場合、この数値は数値形式の年の日です(として認識さstrptimeれます%j)。問題の年が2012年であるとしましょう。

step2 <- strptime(paste(filenumber,"2012",sep="-"),format="%j-%Y")
files.group <- split(files, cut(step2, "month"))

-999値に関してはx[x == -999] <- NA、平均値を計算するときにNA値を除外することを覚えている限り、次のようなトリックを実行する必要があります(つまりcolMeans(x, na.rm=TRUE)

編集:@ f3lixの提案に従ってfilenumber、より簡単な方法で取得できます。

dir1 <- "C:\\New folder (4)\\New folder"
files <- list.files(dir1, "*.bin",full.names=TRUE)
filenumber <- gsub(".*ET([0-9]+).bin", "\\1", files)
files.group <- split(files, cut(strptime(paste(filenumber,"2012",sep="-"),format="%j-%Y"), "month"))

次に、ループ:

results <- list()
for (i in 1:12) {
    x <- do.call(rbind,(lapply(files.group[[i]], readBin  , 
                               double() , size = 4, n =360 * 720, signed =T)))
    x[x == -999] <- NA
    results[[i]] <- colMeans(x, na.rm=TRUE)
    }

for (i in seq_along(results)) {
    fileName <- sprintf("C:\\Users\\New folder\\glo_%d.flt", i)
    writeBin(as.double(results[[i]]), fileName, size = 4)
    }
于 2013-01-18T08:38:11.813 に答える