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

翌月の1日から1日戻ると、月末日を取得できます。だから、これを試してみてください:

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

lubridateこれらのタイプのものに多くの便利な機能を備えたパッケージを使用することをお勧めします。例えば:

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

@Jamesは、1か月の日数を検索する関数を提供しました(これを質問に組み込みました)。次のステップは、月の値を日数で重み付けすることです。問題は、すべての月をまとめたものであり、その後どちらがどちらであるかを判断する方法がないことです。したがって、それらをあまり組み合わせないでください。

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月に対応し、そしてすべての試合の間も同様です。

これは、月ごとに1つずつ、データフレームのリストを作成します。次にcolSums、リスト全体を使用して、各月の合計を含むベクトルを作成します(と同じ順序files)。results最後に、月は日数で対応する値の倍数に繰り返されます(ここでも、それが正しい対応する月であると仮定します)。

于 2012-10-19T18:56:30.553 に答える