1

我正在尝试计算每月产品(二进制文件)的年度总数 https://echange-fichiers.inra.fr/get?k=Jr3tvgeKnWUiC1B0MMY。所以我有 12 个文件,我必须计算总和。下面给出的代码运行良好,但我需要将每个文件乘以对应于该年该月的天数,然后计算总和。就我而言,这些数据是 2000 年(闰年),所以我想将文件号 1 的结果乘以 31,将文件号 2 的结果乘以 29,依此类推....

files<- list.files("C:\\jung file_2000_img", "*.img", full.names = TRUE)
x<- do.call(rbind,(lapply(files, readBin  , double() , size = 4 , n=360 * 720 , signed =TRUE)))
results <- colSums(x)
fileName <- sprintf("C:\\annual_ET2000_without999_1.img")
writeBin(as.double(results), fileName, size = 4)

根据詹姆斯的回答,这将计算天数:

numDays <- function(month,year){
    as.numeric(strftime(as.Date(paste(year+month%/%12,month%%12+1,"01",sep="-"))-1,"%d"))
}

那么现在如何将它应用到我上面的代码中呢?我的意思是我想获取每个文件的结果并将其乘以天数,例如:

file1*numDays(1,2000)+file2*numDays(2,2000)+file3*numDays(3,2000)
   .............file12*numDays(12,2000) 
4

3 回答 3

4

您可以通过从下个月的第一天向后移动一天来获得该月的最后一天。所以,试试这个:

numDays <- function(month,year){
  as.numeric(strftime(as.Date(paste(year+month%/%12,month%%12+1,"01",sep="-"))-1,"%d"))
}

测试:

numDays(2,2012)
 [1] 29
numDays(2,2011)
 [1] 28
numDays(1,2011)
 [1] 31
numDays(12,2011)
 [1] 31
# vector of all month days in year 2000
sapply(1:12,numDays,2000)
 [1] 31 29 31 30 31 30 31 31 30 31 30 31
于 2012-10-19T15:34:55.763 回答
3

我建议你使用 package lubridate,它对这些类型的东西有很多有用的功能。例如:

> lubridate::days_in_month(as.Date("2000-02-01"))
Feb 
 29 
于 2015-02-02T22:30:29.790 回答
1

@James为您提供了一个查找一个月中天数的功能(您已将其纳入您的问题)。下一步是按天数对每月值进行加权。问题是你已经把所有的月份都放在一起了,没有办法知道之后哪个是哪个。所以不要把它们组合那么多:

files<- list.files("C:\\jung file_2000_img", "*.img", full.names = TRUE)
x<- lapply(files, readBin  , double() , size = 4 , n=360 * 720 , signed =TRUE)
results <- sapply(x, colSums)
ann.results <- sum(sapply(1:12, function(m) {results[[m]] * numDays(m, 2000)}))

这是一个巨大的假设:files[[1]]对应于一月,files[[12]]对应于十二月,以及所有匹配之间。

这样做是制作一个数据框列表,每个月一个。然后它使用colSums整个列表来制作一个包含每个月总数的向量(与 相同的顺序files)。最后,将月份迭代为results具有天数的多个对应值(再次假设这是正确的对应月份)。

于 2012-10-19T18:56:30.553 回答