R:获取滞后多列的多个滚动方式

时间:2017-03-06 13:23:02

标签: r data.table dplyr data-cleaning

我想获得过去1到10个事件的滚动方式,这些事件按多列的列分组。我也非常想要它,例如在dplyr或data.table中,因为我想在1,000,000 x 1,000数据帧上运行它。

开始df

data.table(a = c("bill", "bob", "bill", "bob", "bill", "bob"),
       b = c(1,2,1,1,3,2),
       c = c(2,3,9,1,4,1),
       d = c(4,5,1,7,3,4))

 1: bill 1 2 4
 2:  bob 2 3 5
 3: bill 1 9 1
 4:  bob 1 1 7
 5: bill 3 4 3
 6:  bob 2 1 4

期望的df

我希望滚动平均值只有b和c按列a分组,窗口为1到10,每列滞后1行。

     a  b c d b_roll1 c_roll1  b_roll2 c_roll2  b_roll3 c_roll3 
1: bill 1 2 4   NA    NA         NA        NA      NA     NA 
2:  bob 2 3 5   NA    NA         NA        NA      NA     NA  
3: bill 1 9 1   1     2           1        2       1       2   
4:  bob 1 1 7   2     3           2        3       2       3       
5: bill 3 4 3   1     9           1       5.5      1      5.5    
6:  bob 2 1 4   1     1           1        2       1       2              

2 个答案:

答案 0 :(得分:2)

您的示例结果对我来说没有多大意义,但这里有一个关于如何以编程方式生成许多mutate次调用的示例。

使用lazyevalRcppRoll的可扩展解决方案:

library(tidyverse)
vars <- c('b', 'c')
ns <- 1:10
com <- expand.grid(vars, ns, stringsAsFactors = FALSE)

dots <- map2(com[[1]], com[[2]],
             ~lazyeval::interp(~RcppRoll::roll_meanr(x, y, fill = NA), x = as.name(.x), y = .y))
names(dots) <- apply(com, 1, paste0, collapse = '_')

D %>%
  group_by(a) %>% 
  mutate_(.dots = dots)

给出:

Source: local data frame [6 x 24]
Groups: a [2]

      a     b     c     d `b_ 1` `c_ 1` `b_ 2` `c_ 2`   `b_ 3`   `c_ 3` `b_ 4` `c_ 4` `b_ 5` `c_ 5` `b_ 6` `c_ 6` `b_ 7` `c_ 7` `b_ 8` `c_ 8` `b_ 9`
  <chr> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>    <dbl>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1  bill     1     2     4      1      2     NA     NA       NA       NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
2   bob     2     3     5      2      3     NA     NA       NA       NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
3  bill     1     2     1      1      2    1.0      2       NA       NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
4   bob     1     1     7      1      1    1.5      2       NA       NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
5  bill     3     4     3      3      4    2.0      3 1.666667 2.666667     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
6   bob     2     1     4      2      1    1.5      1 1.666667 1.666667     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
# ... with 3 more variables: `c_ 9` <dbl>, b_10 <dbl>, c_10 <dbl>

答案 1 :(得分:1)

我仍然没有完全关注你。您似乎应用了滞后和滚动均值的组合。对于滚动平均值,这是使用dplyrRcppRoll的解决方案。

roll_mean_na <- function(x, lag){
  c(rep(NA, lag - 1), RcppRoll::roll_mean(x, lag, align = "left"))
}

library(dplyr)
df %>% group_by(a) %>%  
   mutate(b_2 = roll_mean_na(b, 2), c_2 = roll_mean_na(c, 2),
          b_3 = roll_mean_na(b, 3), c_3 = roll_mean_na(c, 3),
          b_4 = roll_mean_na(b, 4), c_4 = roll_mean_na(c, 4))