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