-3

I would like to calculate mean of Mean.Temp.c. before certain date, such as 1963-03-23 as showed in date2 column in this example. This is time when peak snowmelt runoff occurred in 1963 in my area. I want to know 10 day’s mean temperature before this date (ie., 1963-03-23). How to do it? I have 50 years data, and each year peak snowmelt date is different.

example data

  • 3
    Please include sample data (preferably using `dput`) and expected output; for more details please take a look at how to provide [a reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – Maurits Evers Feb 21 '19 at 22:34

2 Answers2

0

You can try:

library(dplyr)

df %>%
  mutate(date2 = as.Date(as.character(date2)),
         ten_day_mean = mean(Mean.Temp.c[between(date2, "1963-03-14", "1963-03-23")]))

In this case the desired mean would populate the whole column.

Or with data.table:

library(data.table)

setDT(df)[between(as.Date(as.character(date2)), "1963-03-14", "1963-03-23"), ten_day_mean := mean(Mean.Temp.c)]

In the latter case you'd get NA for those days that are not relevant for your date range.

arg0naut91
  • 14,574
  • 2
  • 17
  • 38
0

Supposing date2 is a Date field and your data.frame is called x:

start_date <- as.Date("1963-03-23")-10
end_date   <- as.Date("1963-03-23")
mean(x$Mean.Temp.c.[x$date2 >= start_date & x$date2 <= end_date])

Now, if you have multiple years of interest, you could wrap this code within a for loop (or [s|l]apply) taking elements from a vector of dates.

ssayols
  • 790
  • 6
  • 10
  • Hi ssayols, this one sounds good. For each year I know start_date, then end_date can be determined. I have the entire 50 years in one dataframe and with year as one column. How do I use column Year as a by_group? both you and arg0naut's solution did not include Year. Also this is my first question, I wanted to have an sample data as a csv, but do not know how to do it, so I pasted an image file for sample data. – West Cotter Feb 22 '19 at 15:59
  • Hi @WestCotter, as someone suggested before, please add a minimal example of your data using `dput` that can be used to reproduce your question. If you don't know how to start, check `?dput` and/or try `dput(head(iris))`. I'm lost now with what you have and what you're trying to achieve... – ssayols Feb 25 '19 at 09:09
  • Hi ssayols, I have just added my example data in a text format, hope this will clarify my question. Thanks you and arg0naut for help. – West Cotter Feb 26 '19 at 16:57