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

R:获取多个滞后列的多个滚动方式,r,data.table,dplyr,data-cleaning,R,Data.table,Dplyr,Data Cleaning,我想得到过去1到10个事件的滚动平均值,这些事件按一列多列分组。我还希望它非常快,比如在dplyr或data.table中,因为我希望在1000000 x 1000数据帧上运行它 启动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

我想得到过去1到10个事件的滚动平均值,这些事件按一列多列分组。我还希望它非常快,比如在dplyr或data.table中,因为我希望在1000000 x 1000数据帧上运行它

启动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
期望测向

我只想要b和c的滚动平均值,按a列分组,每列1行有1到10个窗口

     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              

我还没有完全明白你的意思。似乎你应用了滞后和滚动平均值的组合。对于滚动平均值,这是一个使用
dplyr
RcppRoll
的解决方案

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))
roll_mean_na%group_by(a)%%>%
变异(b_2=滚动平均值(b,2),c_2=滚动平均值(c,2),
b_3=滚动平均值(b,3),c_3=滚动平均值(c,3),
b_4=滚动平均值(b,4),c_4=滚动平均值(c,4))

我还没有完全明白你的意思。似乎你应用了滞后和滚动平均值的组合。对于滚动平均值,这是一个使用
dplyr
RcppRoll
的解决方案

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))
roll_mean_na%group_by(a)%%>%
变异(b_2=滚动平均值(b,2),c_2=滚动平均值(c,2),
b_3=滚动平均值(b,3),c_3=滚动平均值(c,3),
b_4=滚动平均值(b,4),c_4=滚动平均值(c,4))

您的示例结果对我来说没有太大意义,但下面是一个示例,说明如何以编程方式生成许多
mutate
调用

使用
lazyeval
RcppRoll
的可扩展解决方案:

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)
库(tidyverse)

vars您的示例结果对我来说没有太多意义,但下面是一个示例,说明如何以编程方式生成许多
mutate
调用

使用
lazyeval
RcppRoll
的可扩展解决方案:

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)
库(tidyverse)

我不确定我是否理解你。你说的是滞后,但滚动平均值通常是根据窗口大小计算的,向左、向右或居中。例如,对于[2,3,4],左-2滚动平均值为[NA,2.5,3.5]。但是,您的示例显示了不同的结果。没有滚动平均值,这只是值本身。。。你能更具体地说一下你要去哪里吗?你说得对,爱德华。我编辑了所需的数据帧。我不确定是否理解您的意思。你说的是滞后,但滚动平均值通常是根据窗口大小计算的,向左、向右或居中。例如,对于[2,3,4],左-2滚动平均值为[NA,2.5,3.5]。但是,您的示例显示了不同的结果。没有滚动平均值,这只是值本身。。。你能更具体地说一下你要去哪里吗?你说得对,爱德华。我编辑了所需的数据帧。是。这就是我想要的。有没有办法让这个答案更具可扩展性?因此,如果我将其应用于100列,我就不必写出每一个mutate语句。
RcppRoll::roll\u mean
有一个
fill
参数来填充
NA
s。这就是我想要的。有没有办法让这个答案更具可扩展性?因此,如果我将其应用于100列,我就不必写出每一个mutate语句。
RcppRoll::roll\u mean
有一个
fill
参数来填充
NA
s。