library('tidyverse') df <- data.frame( price = seq_len(20), event = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0)) df # price event # 1 1 0 # 2 2 0 # 3 3 0 # 4 4 0 # 5 5 1 # 6 6 0 # 7 7 0 # 8 8 0 # 9 9 0 # 10 10 0 # 11 11 0 # 12 12 1 # 13 13 0 # 14 14 0 # 15 15 0 # 16 16 1 # 17 17 1 # 18 18 0 # 19 19 0 # 20 20 0
You can use lag and lead to get offset values. Then use a combination of gather and spread to flip the data frame into the desired shape.
df %>% mutate( `-2` = lag(price, 2), `-1` = lag(price), `0` = price, `+1` = lead(price)) %>% select(-price) %>% filter(event == 1) %>% mutate(event = paste0('event_', seq_along(event))) %>% gather('offset', 'value', -event) %>% spread(event, value) %>% arrange(as.numeric(offset)) # offset event_1 event_2 event_3 event_4 # 1 -2 3 10 14 15 # 2 -1 4 11 15 16 # 3 0 5 12 16 17 # 4 +1 6 13 17 18
source share