2016-12-02 1 views
-1

Вот пример df, в котором я хотел бы вычислить суммарную сумму по движущемуся окну.Создание движущегося окна cumsum в R

d <- data.frame(y = 1:10) 

Из предыдущего suggestions, я в состоянии выполнить скользящее окно cumsum, используя следующий скрипт (спасибо nograpes):

size <- 2 # size of window 
len <- nrow(d) - size +1 # number of sliding windows to perform 

sumsmatrix <- apply(d, 2, function(x)     
    cumsum(x)[size:nrow(d)] - c(0,cumsum(x)[1:(len-1)])) 

И дает следующий результат:

y 
3 
5 
7 
9 
11 
13 
15 
17 
19 

Моя просьба - выполнить cumsum, перемещая окно, а не скользя. Например взять мой размер окна 2, я хотел бы вычислить cumsum первых двух строк столбца, а затем перейти на 3-й и вычислить для 3-го и 4-го и так далее ..

Желаемая выход:

y 
1 
3 
3 
7 
5 
11 
7 
15 
9 
19 

Как я могу настроить скрипт в соответствии со своими потребностями?

ответ

1

Мы можем сделать группу при работе, создавая группировку переменной с %/%, а затем использовать на группе функций, т.е. tapply

unlist(tapply(d$y, (seq_len(nrow(d))-1)%/% size, FUN = cumsum), use.names = FALSE) 
#[1] 1 3 3 7 5 11 7 15 9 19 
1

Другим способом было бы создать переменную группы и использовать cumsum().

library(dplyr) 

d %>% 
group_by(group = rep(1:(nrow(.)/2), each = 2)) %>% 
transmute(y = cumsum(y)) %>% 
ungroup %>% 
select(-group) 

#  y 
# <int> 
#1  1 
#2  3 
#3  3 
#4  7 
#5  5 
#6  11 
#7  7 
#8  15 
#9  9 
#10 19 
1

Исходный пример, по-видимому, относится к подвижной сумме по окну шириной 2, а не к суммарной сумме. Его можно записать более компактно, как:

library(zoo) 

rollapplyr(d, 2, sum) 

или

rollsum(d, 2) 

или это который не использует пакеты:

apply(d, 2, function(x) rowSums(embed(x, 2))) 

Теперь добраться до фактического вопроса здесь некоторые альтернативы:

1) зоопарк Выполнение cumsum не наката на 2 в то время:

apply(d, 2, function(x) t(rollapplyr(x, 2, cumsum, by = 2))) 

2) нет пакетов Это также будет работать и не использует пакеты:

apply(d, 2, function(x) apply(matrix(x, 2), 2, cumsum)) 

После доработки для работы на каждой колонке его ввода.

Смежные вопросы