0

これはRで私にとってはうまくいきます:

# Setting up the first inner while-loop controller, the start of the next water year
  NextH2OYear <- as.POSIXlt(firstDate)
  NextH2OYear$year <- NextH2OYear$year + 1
  NextH2OYear<-as.Date(NextH2OYear)

しかし、これはしません:

# Setting up the first inner while-loop controller, the start of the next water month
  NextH2OMonth <- as.POSIXlt(firstDate)
  NextH2OMonth$mon <- NextH2OMonth$mon + 1
  NextH2OMonth <- as.Date(NextH2OMonth)

次のエラーが表示されます。

as.Date.POSIXlt(NextH2OMonth) のエラー: 空でない POSIXlt 構造体の長さがゼロのコンポーネント

理由はありますか?体系的に 1 年 (1 つのループの場合) と 1 か月 (別のループの場合) を追加する必要があり、結果として変更された変数を Date クラスの値と比較しています。

ありがとう、トム

編集:

以下は、コードのセクション全体です。RStudio (バージョン 0.97.306) を使用しています。以下のコードは、月次平均を計算するために使用される 2 つの列 (Date (CLass=Date) と Discharge Data (Class=Numeric)) の配列が渡される関数を表しています。したがって、firstDate と lastDate はクラス Date であり、渡された配列. このコードは、年間平均を計算する成功したコードから適応されています.1つまたは2つの変更がまだ必要な場合があります.コードは次のとおりです。

MonthlyAvgDischarge<-function(values){  

  #determining the number of values - i.e. the number of rows
  dataCount <- nrow(values)

  # Determining first and last dates
  firstDate <- (values[1,1])
  lastDate <- (values[dataCount,1])

  # Setting up vectors for results
  WaterMonths <- numeric(0)
  class(WaterMonths) <- "Date"
  numDays <- numeric(0)
  MonthlyAvg <- numeric(0)

  # while loop variables
  loopDate1 <- firstDate
  loopDate2 <- firstDate

  # Setting up the first inner while-loop controller, the start of the next water month
  NextH2OMonth <- as.POSIXlt(firstDate)
  NextH2OMonth$mon <- NextH2OMonth$mon + 1
  NextH2OMonth <- as.Date(NextH2OMonth)

  # Variables used in the loops
  dayCounter <- 0
  dischargeTotal <- 0
  dischargeCounter <- 1
  resultsCounter <- 1
  loopCounter <- 0
  skipcount <- 0

  # Outer while-loop, controls the progression from one year to another
  while(loopDate1 <= lastDate)
  {
    # Inner while-loop controls adding up the discharge for each water year
    # and keeps track of day count
    while(loopDate2 < NextH2OMonth)
    {
      if(is.na(values[resultsCounter,2]))
      {
        # Skip this date
        loopDate2  <- loopDate2 + 1
        # Skip this value
        resultsCounter <- resultsCounter + 1
        #Skipped counter
        skipcount<-skipcount+1
      } else{
        # Adding up discharge
        dischargeTotal <- dischargeTotal + values[resultsCounter,2]
      }

      # Adding a day
      loopDate2  <- loopDate2 + 1
      #Keeping track of days
      dayCounter <- dayCounter + 1
      # Keeping track of Dicharge position
      resultsCounter <- resultsCounter + 1
    }

    # Adding the results/water years/number of days into the vectors
    WaterMonths <- c(WaterMonths, as.Date(loopDate2, format="%mm/%Y"))
    numDays <- c(numDays, dayCounter)
    MonthlyAvg <- c(MonthlyAvg, round((dischargeTotal/dayCounter), digits=0))

    # Resetting the left hand side variables of the while-loops 
    loopDate1 <- NextH2OMonth
    loopDate2 <- NextH2OMonth

    # Resetting the right hand side variable of the inner while-loop
    # moving it one year forward in time to the next water year
    NextH2OMonth <- as.POSIXlt(NextH2OMonth)
    NextH2OMonth$year <- NextH2OMonth$Month + 1
    NextH2OMonth<-as.Date(NextH2OMonth)

    # Resettting vraiables that need to be reset
    dayCounter <- 0 
    dischargeTotal <- 0
    loopCounter <- loopCounter + 1
  } 

  WaterMonths <- format(WaterMonthss, format="%mm/%Y")
  # Uncomment the line below and return AvgAnnualDailyAvg if you want the water years also 
  # AvgAnnDailyAvg <- data.frame(WaterYears, numDays, YearlyDailyAvg) 
  return((MonthlyAvg))
}  

通常のRでも同じエラーが発生します。1行ずつ実行する場合は問題ありませんが、スクリプトとして実行する場合は問題ありません。

4

3 に答える 3

1

プレーンR

seq(Sys.Date(), length = 2, by = "month")[2]
seq(Sys.Date(), length = 2, by = "year")[2]

これはPOSIXltでも機能することに注意してください。

seq(as.POSIXlt(Sys.Date()), length = 2, by = "month")[2]

mondate

library(mondate)
now <- mondate(Sys.Date())
now + 1  # date in one month
now + 12  # date in 12 months

Mondateはmondate("2013-01-31")+ 1、2月の最終日を与えるのに対しseq(as.Date("2013-01-31"), length = 2, by = "month")[2]、3月3日を与えるようなものについては少し賢いです。

yearmon あなたが本当に日の部分を必要としないなら、それからyearmon好ましいかもしれません:

library(zoo)
now.ym <- yearmon(Sys.Date())
now.ym + 1/12 # add one month
now.ym + 1 # add one year

にコメントPOSIXltとセクションを追加しましたyearmon

于 2013-02-13T06:06:18.633 に答える
0

おそらく再現可能な例を提供できますか?には何がfirstDateあり、R のどのバージョンを使用していますか? 私はこの種の POSIXlt 日付の操作を頻繁に行っていますが、うまくいくようです:

Sys.Date()
# [1] "2013-02-13"
date = as.POSIXlt(Sys.Date())
date$mon = date$mon + 1
as.Date(date)
# [1] "2013-03-13"
于 2013-02-13T06:56:37.777 に答える