2016-03-24 7 views
-1

私の最初の質問Stackoverflow :)私はあなたが私を助けることができることを願っています。rで月間最長の連続した数字を取得し、それを合計してそれを保存します

私は、データセットで月に一番長い雨の日を見つけようとしましたが、雨の総量を合計し、雨が降った日数と雨の合計をマトリックスに保存しました。雨の日数を取得して保存するのに成功しましたが、1つのシナリオでは2,5時間、次のシナリオでは12モデル×4つのシナリオが283ポイントでした。私は行列の読み書きが非効率であることをどこかで読んだので、私の推測では操作がより効率的になるということです。

このリンクはすでにlongest consecutiveに役立ちますが、私の質問はさらに進んでいます。

この質問では、2年間の雨量値を使用することをお勧めします。これは、毎月および毎年の最も長い連続した雨の日量を見つけるための日付とリンクします。出力を行列に書きます。そして、盆地の10ポイントを実行しました。

連続した番号を取得し、行列にそれを書くために使用される機能:

WriteRainyDaysCountToMatrix <- function(myDataFrame, myDates, mymatrix, i) 
{ 
    monthsAmount <- 24 
    for (monthNumber in 1:monthsAmount){ 
    #print(cat("monthNumber = ", monthNumber)) 
    year <- toString(myDates[monthNumber,2]) 
    month <- toString(myDates[monthNumber,1]) 
    dayCounter <- 0 
    precipitationMax <- 0 
    lastRowPrecipitation <- F 

    for (rowNumber in 1:nrow(myDataFrame)){ 
    rowDate <- myDataFrame[rowNumber,1] 
    rowYear <- substr(rowDate,1,4) 
    rowMonth <- substr(rowDate,5,6) 

    if (rowYear == year && rowMonth == month){ 
     rowPrecipitation <- myDataFrame[rowNumber,2] 

     if (rowPrecipitation > 0){ 
     dayCounter <- dayCounter + 1 
     lastRowPrecipitation <- T 
     } 
     else{ 
      if (lastRowPrecipitation == T && precipitationMax == 0){ 
      precipitationMax <- dayCounter 
      dayCounter <- 0 
      lastRowPrecipitation <- F 
     } 
     else if (lastRowPrecipitation == T && precipitationMax < dayCounter){ 
     precipitationMax <- dayCounter 
     dayCounter <- 0 
     lastRowPrecipitation <- F 
     } 
     else{ 
     dayCounter <- 0 
     lastRowPrecipitation <- F 
     } 
    } 
    } 
} 
if (lastRowPrecipitation == T && precipitationMax == 0){ 
    precipitationMax <- dayCounter 
} 
mymatrix[[monthNumber,i]] <- precipitationMax 
} 
return (mymatrix) 
} 

値を格納するために、空の行列はここで定義されています

pmatrix_hist <- matrix(data=NA,nrow=12,ncol=10,dimnames=list(c(1:24),c(1:10))) 

日付入力(テキストファイルとして)myDates:

01 1981 02 1981 03 1981 04 1981、 05 1981 06 1981 07 1981 08 1981 09 1981 10 1981、 11 1981、12 19 81、1982年01、02 1982、03 1982、04 1982、 05 1982、06 1982、07 1982、08 1982、09 1982、10 1982、 11 1982、12 1982、など

Time_step_histは、テキストから来ていますこの形式での2年間の日付を含むファイル:

19810101、19810102、19810103、19810104、19810105など

そして、私のために仕事をするために、forループ:

for (i in 1:10) { 
    # loop over dates and acquire date  
    Prec_hist = read.table(paste(P_read_table_hist$V1[i]), header=F) 
    # then put date and rain together 
    data_Prec_Hist <- data.frame(Time_step_hist[1:7305,],  Prec_hist[1:7305,]) 
    # call function to get and write to matrix 
    pmatrix_hist <- WriteRainyDaysCountToMatrix(data_Prec_Hist, Dates_hist, pmatrix_hist, i) 
    } 

私にはわかりません私が使っている雨のデータを入れる方法は、単純なlis代わりに0と1のtを使用することができます。

マトリックスには日数のみが格納され、これらの連続した日の間に雨の合計を格納するための2番目のマトリックスが可能です。

最大のパフォーマンス向上はどこで可能ですか?

事前に感謝します。

答えて

0

ようこそ! あなたはこの種の操作が時間ではなく数秒で測定されるべきであるという本能が正しいです。

あなたの最大の利益は、ループを最小化し、ベクトル化された関数を使用することになります。

開始するには、文字列を日付に変換するためにas.Dateを使用し、ループを単純化するためにサブセットを使用することをお勧めします。

年と月を通過するすべてのネストされたループの代わりに、as.Date('19810101',"%Y%m%d")を使用して文字列を日付に変換することを検討してください。

改訂された構造は次のようになります。「myDataFrame」には日付の列と降水値の列があるはずです。

set.seed(42)#for repeatability 
#Dummy Data 
#some dates 
dates <- seq(as.Date("19810101","%Y%m%d"), as.Date("19821231","%Y%m%d"), by = "day") 
#random Precipitation 
precip <- sample(0:3,length(dates), replace = TRUE, prob = c(.7,.1,.1,.1)) 
myDataFrame<- data.frame(dates,precip) 

# 
#real code 
# 

#Create a month Column 
myDataFrame$month <- as.numeric(format(myDataFrame$dates,'%m')) 
myDataFrame$year <- as.numeric(format(myDataFrame$dates,'%Y')) 

#order your data frame by date 
myDataFrame[order(as.Date(myDataFrame$dates)),] 

#create lists of the months, and years to drive loops later 
yr_list <- levels(factor(myDataFrame$year)) 
mo_list <- levels(factor(myDataFrame$month)) 

#A smoother loop structure will look like like this, relying on subsetting 
for(y in yr_list){ 
    suby <- subset(myDataFrame, myDataFrame[,"year"] == y) 
    for(m in mo_list){ 
    subm <- subset(suby, suby[,"month"] ==m) 
    for(d in 1:length(subm)){ 
     #here you can run your count for each month, and then write the record 
     #to a data structure of your choosing 
     } 
     } 
    } 

将来に役立つだろういくつかのもの:1)あなたのデータソースが2どのように見えるかdput)は、出力は、あなたがのために行くされているされているものの最小限の例を示しています。

いくつかのヒント一般的なヒント:スクリプトに導入する日付をサブセット化すると、より速く反復するのに役立ち、コードを測定するためにsystem.time()およびproc.time()を検索して、

+0

コメントいただきありがとうございます。私は少し私を参照して終了する変更する必要があります! – jjjj

関連する問題