R: ventana deslizante rápida con coordenadas dadas

Tengo una tabla de datos con nrow alrededor de un millón o dos y ncol de aproximadamente 200.

Cada entrada en una fila tiene una coordenada asociada con ella.

Pequeña porción de los datos:

[1,] -2.80331471  -0.8874522 -2.34401863   -3.811584   -2.1292443
[2,]  0.03177716   0.2588624  0.82877467    1.955099    0.6321881
[3,] -1.32954665  -0.5433407 -2.19211837   -2.342554   -2.2142461
[4,] -0.60771429  -0.9758734  0.01558774    1.651459   -0.8137684

Coordenadas para las primeras 4 filas:

9928202 9928251 9928288 9928319

Lo que me gustaría es una función que, dado los datos y el tamaño de la ventana, devolvería una tabla de datos del mismo tamaño con una ventana deslizante media aplicada en cada columna. O en otras palabras - para cada entrada de filai encontraría entradas con coordenadas entre coords [i] -windsize y coords [i] + windsize y reemplazará el valor inicial con la media de los valores dentro de ese intervalo (por separado para cada columna).

La velocidad es el principal problema aquí.

Aquí está mi primera toma de tal función.

doSlidingWindow <- function(intensities, coords, windsize) {
windHalfSize <- ceiling(windsize/2)
### whole range inds
RANGE <- integer(max(coords)+windsize)
RANGE[coords] <- c(1:length(coords)[1])

### get indeces of rows falling in each window
COORDS <- as.list(coords)
WINDOWINDS <- sapply(COORDS, function(crds){ unique(RANGE[(crds-windHalfSize):
    (crds+windHalfSize)]) })

### do windowing

wind_ints <- intensities
wind_ints[] <- 0
for(i in 1:length(coords)) {
    wind_ints[i,] <- apply(as.matrix(intensities[WINDOWINDS[[i]],]), 2, mean)
}
return(wind_ints)
}

El código anterior al último bucle for es bastante rápido y me proporciona una lista de los índices que necesito usar para cada entrada. Sin embargo, todo se derrumba, ya que necesito moler el bucle for un millón de veces, tomar subconjuntos de mi tabla de datos y también asegurarme de que tengo más de una fila para poder trabajar con todas las columnas de una sola vez.

Mi segundo enfoque es simplemente pegar los valores reales en la lista de RANGO, llenar los huecos con ceros y hacer rollmean desde el paquete del zoo, repetido para cada columna. Pero esto es redundante ya que rollmean atravesará todos los huecos y al final solo usaré los valores para las coordenadas originales.

Cualquier ayuda para hacerlo más rápido sin ir a C sería muy apreciada.

Respuestas a la pregunta(2)

Su respuesta a la pregunta