2016-02-17 11 views
2

Следующий код примера данные:совокупная сумма к зигзагообразной показателю

library(TTR) 
set.seed(15) 
r <- rnorm(1000, 0, .01) 
P_1 <- 100 
P <- P_1*cumprod(1+r) 
zz <- ZigZag(P, change = 5, percent = TRUE) 
set.seed(15) 
volume <- round(runif(1000, 50, 550), digits = 0) 
data <- as.data.frame(cbind(P, zz, volume)) 
plot(P, type = "l") 
lines(zz, col = "red") 

в конце концов, я хотел бы создать кумулятивную сумму объема в новую колонку, где сброс происходит, когда зигзагообразная линия (ZZ) меняет направление. Я попытался сыграть с s <- sign(diff(data$zz, lag = 1)), который показал бы эти поворотные моменты, но не смог использовать cumsum с ним.

+1

Извиняюсь за ужасными английский, а не мои Nati ve язык. Спасибо за редактирование. – Hakki

ответ

2

Вот решение, которое использует dplyr:

library(dplyr) 

data %>% 
    mutate(
    zz_up = (zz - lag(zz) > 0), 
    zz_switch = zz_up != lag(zz_up), 
    zz_switch = ifelse(is.na(zz_switch), FALSE, zz_switch), 
    group = cumsum(zz_switch) 
    ) %>% 
    group_by(group) %>% 
    mutate(cum_volume = cumsum(volume)) 
+0

Спасибо, отлично выглядит. Мне нужно научиться dplyr точно. – Hakki

2

Покушение с RcppRoll:

Код

Vectorize(require)(package = c("magrittr", "dplyr", "RcppRoll"), 
           char = TRUE) 

data %<>% 
    # Create difference for ZigZag 
    mutate(diffZZ = c(0,diff(zz))) %>% 
    # Use it as a group 
    group_by(diffZZ) %>% 
    # Use RcppRoll to compute that sum 
    mutate(sumVolByDiff = roll_sum(x = volume, n = 2, fill = NA)) %>% 
    # Clean/not important 
    ungroup() 

Просмотр

> head(data) 
Source: local data frame [6 x 5] 

     P  zz volume diffZZ sumVolByDiff 
    (dbl) (dbl) (dbl) (dbl)  (dbl) 
1 100.2588 100.2588 351 0.000000   NA 
2 102.0947 100.5596 148 0.300785   523 
3 101.7480 100.8604 533 0.300785   1077 
4 102.6608 101.1612 375 0.300785   609 
5 103.1618 101.4620 234 0.300785   692 
6 101.8668 101.7627 544 0.300785   938