У меня есть набор данных с тремя интересующими числовыми столбцами. Рассматривая один из трех столбцов, для каждой строки я хочу суммировать наблюдения окрестностей, которые я определяю окном. Поэтому я делаю это для всех наблюдений (для каждого столбца).
До сих пор я управлял этой функцией:
slideSum <- function(data, column, window){
total <- nrow(data)
for(window_i in seq(window[1],window[2],window[3])){
left = pmax(1,c(1:total)-window_i)
right = pmin(total,c(1:total)+window_i)
for(i in 1:total){
set(data, i, j = paste0(column,window_i),
value = data[left[i]:right[i],sum(get(column))])
}
}
}
аргументы - это данные, какой из трех столбцов яхотеть, и вектор из трех записей (минимальная длина окна, максимальная длина окна и шаги окна), например window = c (10,20,1), будет использовать окна длиной 10, 11, 12, ..., 20.
Я думаю, что мой код относительно быстрый, но есть ли способ сделать его быстрее? Кроме того, моя функция обрабатывает каждый столбец отдельно, есть ли способ выполнить одну и ту же операцию с тремя интересующими столбцами с одинаковой скоростью?
Данные:
data <- data.table(money=runif(1000, min=0, max=.1),
debt=runif(1000, min=.05, max=.1),
misc = runif(1000, min=.05, max=1))
дает мне следующий прогонвремя:
> system.time(slideSum(data, "money", c(10, 20, 2)))
user system elapsed
16.23 9.73 23.89