0

次のようなdailyというデータフレームがあります。

      daily[1:10,]
         Climate_Division    Date      Precipitation
      1                 1 1948-07-01     0.2100000
      2                 1 1948-07-02     0.7000000
      3                 1 1948-07-03     0.1900000
      4                 1 1948-07-04     0.1033333
      5                 1 1948-07-05     0.1982895
      6                 1 1948-07-06     0.1433333
      7                 1 1948-07-07            NA
      8                 1 1948-07-08            NA
      9                 1 1948-07-09            NA
      10                1 1948-07-10            NA

私が達成したい目的は、その特定の日に発生するNA値を置き換えるために、年間(1948-1995)のすべての日の値を平均することです。たとえば、行7には1948年7月7日のNAがあるため、1948年から1995年までの7月7日すべてを平均し、その特定の日を平均に置き換えます。

私がこれまでに試したことはこれです:

 index <- which(is.na(daily$Precipitation)) # find where the NA's occur
 daily_avg <- daily # copy dataframe
 daily_avg$Date <- strftime(daily_avg$Date, format="2000-%m-%d") # Change the Date format to represent only the day and month and disregard year
 daily_avg <- aggregate(Precipitation~Date, FUN = mean, data = daily_avg, na.rm = TRUE) # find the mean precip per day 
 daily[index,3] <- daily_avg[daily_avg$Date %in% strftime(daily[index,2], format="2000-%m-%d"), 2]

コードの最後の行が正しく機能していません。理由はまだわかりません。それが、この問題についての私の思考プロセスがどのように進んでいるかです。しかし、私が知らない組み込み関数を使用してそれを行うより良い方法があるかどうか疑問に思いました。どんな助けでも大歓迎です。ありがとうございました

4

3 に答える 3

2

使用するdata.table

いくつかのダミーデータ

 set.seed(1)
 library(data.table)
 daily <- seq(as.Date('1948-01-01'),as.Date('1995-12-31')
 dd <- data.table(date = daily, precip = runif(length(daily)))
 # add na values
 nas <- sample(length(daily),300, FALSE)
 dd[, precip := {is.na(precip) <- nas; precip}]


 ## calculate the daily averages
 # add day and month
 dd[, c('month','day') := list(month(date), mday(date))]

 monthdate <- dd[, list(mprecip = mean(precip, na.rm = TRUE)),
                  keyby = list(month, date)]
 # set key for joining
  setkey(dd, month, date)
 # replace NA with day-month averages
 dd[monthdate, precip := ifelse(is.na(precip), mprecip, precip)]
 # set key to reorder to daily

 setkey(dd, date)
于 2013-03-20T04:54:09.827 に答える