2011-07-29 9 views
9

Tengo una matriz de 4n por m (sumas en intervalos de 7,5 min durante un año). Me gustaría transformarlos en sumas de 30 minutos, p. convertir una matriz de 70080 x 1 a 17520.Cómo obtener la suma de cada cuatro filas de una matriz en R

¿Cuál es la forma más eficiente computacionalmente para hacer esto?

Más detalles: Aquí se presenta un ejemplo (acortaron a un día en lugar de un año)

library(lubridate) 
start.date <- ymd_hms("2009-01-01 00:00:00") 
n.seconds <- 192 # one day in seconds 
time <- start.date + c(seq(n.seconds) - 1) * seconds(450) 

test.data <- data.frame(time = time, 
         observation = sin(1:n.seconds/n.seconds * pi)) 

versión R: 2,13; Plataforma: x86_64-pc-linux-gnu (64-bit)

+0

afecta la matriz tiene una columna que representa el índice de tiempo? –

+1

La pregunta tal como está no es realmente comprensible: su título y su primera oración brindan información diferente. Agregue información adicional y bríndenos algún ejemplo reproducible, como se explica [en esta pregunta] (http://www.stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+1

@Joris me disculpo por eso. He actualizado mi pregunta. – Abe

Respuesta

16
colSums(matrix(test.data$observation, nrow=4)) 
+0

agradable, simple _y_ rápido – Abe

7

Voy a hacer una serie de suposiciones locas ya que su pregunta es bastante ambigua.

Supongo que sus datos son una matriz con observaciones cada 7.5 min y no hay índice espacial. Así que 100 filas pueden verse así:

data <- matrix(rnorm(400), ncol=4) 

y desea sumar los trozos de 4 filas.

Hay muchas formas de hacerlo, pero la primera que me viene a la mente es crear un índice y luego hacer la versión R de un "grupo por" y sumar.

Un índice ejemplo podría ser algo como esto:

index <- rep(1:25, 4) 
index <- index[order(index)] 

Así que ahora que tenemos un índice de la misma longitud que los datos, puede utilizar aggregate() a resumir las cosas:

aggregate(x=data, by = list(index), FUN=sum) 

EDITAR:

El espíritu del método anterior aún puede funcionar. Sin embargo, si trabajas mucho con datos de series temporales, probablemente deberías conocer el paquete xts. He aquí un ejemplo XTS:

require(xts) 
test.xts <- xts(test.data$observation, order.by=test.data$time) 
period.apply(test.xts, endpoints(test.xts,"minutes", 30), sum) 
+0

Gracias por su útil respuesta, y me disculpo por mi ambigüedad. He actualizado mi respuesta con un ejemplo, incluida la columna de tiempo. – Abe

2
sapply(split(test.data$observation, rep(1:(192/4), each=4)), sum) 
Cuestiones relacionadas