How to take a 5-day average around a specific date in r -



How to take a 5-day average around a specific date in r -

so have dataset looks without weekends:

x1 x2 3798 2009-12-29 0 3799 2009-12-30 0 3800 2009-12-31 0 3802 2010-01-02 0 3803 2010-01-03 2.1 3804 2010-01-04 0 3805 2010-01-05 0 3806 2010-01-06 0 3807 2010-01-07 0 3808 2010-01-08 0 3809 2010-01-09 0 3810 2010-01-10 6.8 3811 2010-01-12 0 3812 2010-01-13 0 3813 2010-01-14 17.7 3814 2010-01-16 0 3815 2010-01-17 0 3816 2010-01-18 1.5 3817 2010-01-19 0 3818 2010-01-20 0 3819 2010-01-21 0 3820 2010-01-22 0 3821 2010-01-23 0 3822 2010-01-24 0 3823 2010-01-25 0 3824 2010-01-26 0 3825 2010-01-27 4.5 3826 2010-01-28 0 3827 2010-01-29 0 3828 2010-01-31 0 3829 2010-02-01 0 3830 2010-02-03 0 3831 2010-02-04 0 3832 2010-02-05 0 3833 2010-02-07 0 3834 2010-02-08 0 3835 2010-02-09 1.2

and want take 5-day average around 15th day of each month, , if 15th happens on weekend , doesn't exist in dataset, want take 5-day average around closest date (14th or 16th), possible?

so expected output

x1 x2 5-day average 1 2009-12-14 2 2 2010-01-15 3 3 2010-02-15 4 4 2010-03-16 2 5 2010-04-15 1 6 2010-05-14 7

it pretty easy take rolling averages rollapply function zoo. can extract ones need (i.e. around 15th of each month).

# packages used require(data.table) require(zoo) # info preparation df <- read.table(text=' x1 x2 3798 2009-12-29 0 3799 2009-12-30 0 3800 2009-12-31 0 3802 2010-01-02 0 3803 2010-01-03 2.1 3804 2010-01-04 0 3805 2010-01-05 0 3806 2010-01-06 0 3807 2010-01-07 0 3808 2010-01-08 0 3809 2010-01-09 0 3810 2010-01-10 6.8 3811 2010-01-12 0 3812 2010-01-13 0 3813 2010-01-14 17.7 3814 2010-01-16 0 3815 2010-01-17 0 3816 2010-01-18 1.5 3817 2010-01-19 0 3818 2010-01-20 0 3819 2010-01-21 0 3820 2010-01-22 0 3821 2010-01-23 0 3822 2010-01-24 0 3823 2010-01-25 0 3824 2010-01-26 0 3825 2010-01-27 4.5 3826 2010-01-28 0 3827 2010-01-29 0 3828 2010-01-31 0 3829 2010-02-01 0 3830 2010-02-03 0 3831 2010-02-04 0 3832 2010-02-05 0 3833 2010-02-07 0 3834 2010-02-08 0 3835 2010-02-09 1.2', header=true) setdt(df) df[, x1 <- as.date(x1)] setkey(df, x1) # taking rolling averages df[, rmean:=rollapply(x2, 5, mean, fill=na)] # extracting rolling averages need dt <- df[, list(day15=abs(mday(x1)-15) == min(abs(mday(x1)-15)), x1, rmean), by=list(year(x1), month(x1))] dt[day15==true] dt[day15==true, .sd[1,] ,by=list(month, year)]

r

Comments

Popular posts from this blog

formatting - SAS SQL Datepart function returning odd values -

c++ - Apple Mach-O Linker Error(Duplicate Symbols For Architecture armv7) -

php - Yii 2: Unable to find a class into the extension 'yii2-admin' -