У меня есть таблица данных, в которой nrow составляет около миллиона или двух, а ncol — около 200.
Каждая запись в строке имеет связанную с ней координату.
Крошечная часть данных:
[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
Координаты для первых 4 рядов:
9928202 9928251 9928288 9928319
Я хотел бы, чтобы функция, которая, учитывая данные и размер окна, возвращала бы таблицу данных того же размера со средним скользящим окном, применяемым к каждому столбцу. Или, другими словами, для каждой записи строки i будут найдены записи с координатами между coords[i]-windsize и coords[i]+windsize и заменено начальное значение средним значением значений внутри этого интервал (отдельно для каждого столбца).
Здесь главное скорость.
Вот мой первый пример такой функции.
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)
}
Код перед последним циклом for довольно быстрый и дает мне список индексов, которые мне нужно использовать для каждой записи. Однако затем все разваливается, так как мне нужно перемолоть цикл for миллион раз, взять подмножества моей таблицы данных, а также убедиться, что у меня есть более одной строки, чтобы иметь возможность работать со всеми столбцами сразу внутри применения.
Мой второй подход состоит в том, чтобы просто вставить фактические значения в список RANGE, заполнить промежутки нулями и выполнить rollmean из пакета зоопарка, повторяя для каждого столбца. Но это избыточно, так как rollmean пройдет через все промежутки, и в конце я буду использовать только значения исходных координат.
Любая помощь, чтобы сделать это быстрее, не переходя на C, будет очень признательна.
zoo
, но вы уверены, что использованиеrollmean(data,fill=NA)
будет недостаточно быстрым? - person Carl Witthoft   schedule 07.01.2013wind_ints[i,] <- apply(matrix(intensities[WINDOWINDS[[i]],], ncol=ncol(intensities)), 2, mean)
. Когда в окне только одна строка, ваш код приводит к неправильным результатам. - person redmode   schedule 20.01.2013