如何使用R指定特定年份的每月天数?

如何使用R指定特定年份的每月天数?,r,binary,R,Binary,我试图计算每月产品二进制文件的年度总数。所以我有12个文件,我必须计算总数。下面给出的代码运行良好,但我需要的是将每个文件乘以对应于该年该月的天数,然后计算总数。在我的例子中,这些数据是2000年的闰年,所以我想把1号文件的结果乘以31,2号文件的结果乘以29,以此类推 files<- list.files("C:\\jung file_2000_img", "*.img", full.names = TRUE) x<- do.call(rbind,(lapply(files, re

我试图计算每月产品二进制文件的年度总数。所以我有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"))
}

从下个月的第一天向后移动一天,就可以得到一个月的最后一天。那么,试试这个:

numDays <- function(month,year){
  as.numeric(strftime(as.Date(paste(year+month%/%12,month%%12+1,"01",sep="-"))-1,"%d"))
}
为您提供了一个函数,用于查找一个月中包含在问题中的天数。下一步是根据天数对每月值进行加权。问题是你把所有的月份都放在一起了,之后就没办法分辨出哪个是哪个了。因此,不要将它们结合得太多:

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)}))
这就产生了一个巨大的假设:文件[[1]]对应于1月,文件[[12]]对应于12月,并且所有这些文件都在匹配之间

这样做的目的是制作一个数据帧列表,每个月一个。然后在列表中使用colSums生成一个向量,每个月的总数与文件的顺序相同。最后,假设月份是正确的对应月份,则将月份迭代为相应结果值的倍数,并再次乘以天数。

提供了一个函数,用于查找一个月内的天数,并将其合并到问题中。下一步是根据天数对每月值进行加权。问题是你把所有的月份都放在一起了,之后就没办法分辨出哪个是哪个了。因此,不要将它们结合得太多:

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)}))
这就产生了一个巨大的假设:文件[[1]]对应于1月,文件[[12]]对应于12月,并且所有这些文件都在匹配之间


这样做的目的是制作一个数据帧列表,每个月一个。然后在列表中使用colSums生成一个向量,每个月的总数与文件的顺序相同。最后,假设月份是正确的对应月份,则将月份迭代为相应结果值的倍数,并再次乘以天数。

我建议您使用lubridate软件包,该软件包对这些类型的内容具有许多有用的功能。例如:

> lubridate::days_in_month(as.Date("2000-02-01"))
Feb 
 29 

我建议您使用lubridate包,它对这类事情有很多有用的功能。例如:

> lubridate::days_in_month(as.Date("2000-02-01"))
Feb 
 29 

@Wafaalyari我添加了一个示例,以获取特定年份的所有月份天数作为向量。x是矩阵吗?如果是这样,你只需要乘以这个。是的,它是一个矩阵。你的意思是我这样做x*sapply1:12,numDays,2000然后results@wafaalyari我添加了一个示例,以获取特定年份的所有月份天数作为向量。x是矩阵吗?如果是这样,你只需要乘以这个。是的,它是一个矩阵。你的意思是我这样做x*sapply1:12,numDays,2000,然后结果在你的示例中是什么文件1?我每个月在一个目录中有12个文件。文件1.文件2.文件3。在您的示例中,file1是什么?我在一个目录中每月有12个文件。file1.file2.file3。我得到了这些错误:>results ann.results我不得不猜测你的数据结构,我没有测试我的答案,因为没有这些文件,这个例子是不可复制的。如果你能以一种可复制的方式给出x的一部分,那么我们就可以给你工作代码。请看,我得到了这些错误:>results ann.results我不得不猜测您的数据结构,我没有测试我的答案,因为没有这些文件,示例是不可复制的。如果你能以一种可复制的方式给出x的一部分,那么我们就可以给你工作代码。看见