我正在尝试计算每月产品(二进制文件)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)
根据Jame的回答,这将计算天数:
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)
答案 0 :(得分: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
答案 1 :(得分:3)
我建议您使用包lubridate
,它对这些类型的东西有许多有用的功能。例如:
> lubridate::days_in_month(as.Date("2000-02-01"))
Feb
29
答案 2 :(得分: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]]
对应于1月,files[[12]]
对应于12月,所有对应于匹配。
这样做的是制作一个数据框列表,每个月一个。然后,它会在列表中使用colSums
来生成一个包含每个月总计的向量(与files
相同的顺序)。最后,将月份迭代到具有天数的相应results
值的倍数(同样,假设这是正确的相应月份)。