1

How to calculate the running mean starting from the 4th column of "datamean" (since the width=4) and have first and last three columns as "NA" or empty?

 require(zoo)    
 data <- zoo(seq(1:10))
 datamean <- rollapply(data, width=4, by=1, FUN=mean, align="left")
 cbind(data, datamean)

Currently the output is this:

    data datamean
1     1      2.5
2     2      3.5
3     3      4.5
4     4      5.5
5     5      6.5
6     6      7.5
7     7      8.5
8     8       NA
9     9       NA
10   10       NA

However I want:

    data datamean
1     1      NA
2     2      NA
3     3      NA
4     4      2.5
5     5      3.5
6     6      4.5
7     7      5.5
8     8      NA
9     9      NA
10   10      NA
Rupesh
  • 41
  • 8

1 Answers1

1

We can calculate the rolling mean first, and then manipulate the datamean column later. mutate and ifelse can examine a certain row number (in this case, the last three) and replace those numbers to NA. dt2 is the final output.

library(dplyr)
require(zoo)

dt <- data_frame(data = zoo(seq(1:10)))

dt2 <- dt %>%
  mutate(datamean = rollmean(data, k = 4, fill = NA, align = "right")) %>%
  mutate(datamean = ifelse(row_number() %in% n():(n() - 2), NA, datamean))

dt2
# A tibble: 10 x 2
        data datamean
   <S3: zoo>    <dbl>
 1         1       NA
 2         2       NA
 3         3       NA
 4         4      2.5
 5         5      3.5
 6         6      4.5
 7         7      5.5
 8         8       NA
 9         9       NA
10        10       NA
www
  • 38,575
  • 12
  • 48
  • 84