【发布时间】:2020-02-04 00:01:58
【问题描述】:
我正在尝试一次获得多列的滚动平均值,但我遇到了困难,因为我的分组变量不是数字。
如果我要一次对一列进行滚动平均,我的代码应该如下所示:
NHLReg2<-arrange(NHLReg2,season,team,gameId) %>% group_by(season,team)%>% mutate(xGF= rollapply(xGoalsFor, list( seq(21)), sum, partial = TRUE, fill = NA))
我曾尝试使用 dplyr 来同时处理多个列:
NHLPP3<-arrange(NHLPP2,season,team,gameId) %>%
group_by(season,team)%>%
select(c(1,2,11:112)) %>%
lapply(function(x){ if(class(x) == "numeric"){
rollapply(x, width=list(-seq(21)), FUN=function(x){sum(x,
na.rm=T)},partial = T, fill = NA)
}else{
return(x)
}
})%>% as.data.frame()
这确实解决了rollapply忽略字符/分组变量的问题,但它会导致groupby语句不起作用。我在下面留下了一些示例数据,假设 v1 和 v2 是分组变量,而 v3 和 v4 是计算滚动平均值的感兴趣的列。
v1<-c('a','a','a','a','a','a','a','a','b','b','b','b','b','b','b')
v2<-c('2010','2010','2010','2010','2010','2010','2010','2010','2020','2020','2020','2020','2020','2020','2020')
v3<-c(1,2,3,4,1,4,5,6,13,5,6,13,4,65,8)
v4<-c(6,13,5,6,13,4,65,8,1,2,3,4,1,4,5)
Data<-as.data.frame(t(rbind(v1,v2,v3,v4)))
谢谢。
【问题讨论】:
-
您是在寻找
mutate_if还是mutate_at? (另外我建议在代码中使用更多的空格和缩进以保持可读性。)
标签: r group-by dplyr lapply rollapply