如何计算R中每日文件的月平均值?

时间:2013-01-18 08:13:32

标签: r

我有[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)
    }

我很感激任何想法:

1 个答案:

答案 0 :(得分:4)

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

首先,你必须提取文件的编号(因为它们没有按你希望它们排序的方式排序(即“ET10.bin”在“ET1.bin”之后,而不是“ET9.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值,只要你记得在计算平均值时排除NA值(例如x[x == -999] <- 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)
    }