[R] block averaging data frames

jim holtman jholtman at gmail.com
Mon Dec 19 14:00:14 CET 2011


Does this work for you:

> x <- read.table(text = " date time  Voltage LwTempDownelling LwDownwelling LwDownwelling_min LwDownwelling_max LwTempUpwelling
+ 1 2011-11-01 00:00:00 2.732447            17.30          30.0
      14.0              39.5           17.83
+ 2 2011-11-01 00:10:00 2.731534            17.46          15.3
      11.1              24.6           17.95
+ 3 2011-11-01 00:20:00 2.731368            17.43          28.7
      24.6              30.7           17.93
+ 4 2011-11-01 00:30:00 2.730703            17.36          40.4
      29.8              43.5           17.86
+ 5 2011-11-01 00:40:00 2.729567            17.26          41.6
      40.5              42.6           17.76"
+     , header = TRUE
+     )
> # convert the time
> x$timestamp <- as.POSIXct(paste(x$date, x$time))
> # calculate the start of time ranges
> start <- trunc(min(x$timestamp), units = 'hour')
> # create breakpoints at 30 minutes
> breaks <- seq(from = start
+             , to = max(x$timestamp) + 3600  # make sure you have the
last range
+             , by = '30 min'
+             )
> # slice up the data by adding index
> x$interval <- findInterval(x$timestamp, breaks)
>
> # determine colMeans
> newData <- do.call(rbind, tapply(x[4:8], x$interval, colMeans))
> newData <- as.data.frame(newData)
>
> # add the time back
> newData$timestamp <- breaks[as.integer(rownames(newData))]
> newData
  LwTempDownelling LwDownwelling LwDownwelling_min LwDownwelling_max
LwTempUpwelling
1         17.39667      24.66667          16.56667             31.60
     17.90333
2         17.31000      41.00000          35.15000             43.05
     17.81000
            timestamp
1 2011-11-01 00:00:00
2 2011-11-01 00:30:00
>
>


On Mon, Dec 19, 2011 at 4:28 AM, Mathew Brown
<mathew.brown at forst.uni-goettingen.de> wrote:
>
>
> Hi there,
>
> This seems like it should be simple. I have a data frame of climate data
> sampled every 10 min. I want to average the entire data frame into 30
> min values (i.e., one value for each half hour).  Functions like
> running.mean give me a moving average but I want to reduce the size of
> the entire frame.. Any ideas how? Cheers!
>
> Example of my data
>
>  timestamp  Voltage LwTempDownelling LwDownwelling LwDownwelling_min LwDownwelling_max LwTempUpwelling
> 1 2011-11-01 00:00:00 2.732447            17.30          30.0              14.0              39.5           17.83
> 2 2011-11-01 00:10:00 2.731534            17.46          15.3              11.1              24.6           17.95
> 3 2011-11-01 00:20:00 2.731368            17.43          28.7              24.6              30.7           17.93
> 4 2011-11-01 00:30:00 2.730703            17.36          40.4              29.8              43.5           17.86
> 5 2011-11-01 00:40:00 2.729567            17.26          41.6              40.5              42.6           17.76
> 6 2011-11-01 00:50:00 2.728976            17.16          39.7
>
>
> -M.B
>
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



-- 
Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.



More information about the R-help mailing list