【发布时间】:2015-12-05 17:28:14
【问题描述】:
我无法弄清楚为什么我的 dplyr group_by/mutate_each 函数会崩溃。当我使用默认的 n=2 运行 mutate_each 时,它可以工作。两者都不适用于 n=1 或 n=3。
library(dplyr)
## moving average function
get.mavg <- function(mycol, n=2) {
require(zoo)
mycol <- na.locf(mycol, na.rm=FALSE)
if(length(mycol) < n)
return(mycol)
c(mycol[1:(n-1)], rollapply(mycol, width=n, mean, align="right"))
}
dummy <- data_frame(Name1=c("A","A","A","A","B","B","B"),
Name2=c("B","B","C","C","C","C","C"),
stat = c(0,5,5,10, 10,5,5),
day = c(1:4, 1:3) )
dummy %>%
group_by(Name2) %>%
mutate_each(funs(get.mavg(.,3)), stat:day)
错误:不兼容的类型,需要一个整数向量
如果我尝试将列单独传递给我的移动平均函数,它会起作用!
get.mavg(dummy[dummy$Name2=="B",]$stat, 3)
# [1] 0 5
get.mavg(dummy[dummy$Name2=="C",]$stat, 3)
# [1] 5.000000 10.000000 8.333333 8.333333 6.666667
发生了什么事?
【问题讨论】:
-
虽然这并不等同于你所拥有的,但你真正想要的是:
dummy %>% group_by(Name2) %>% mutate_each(funs(rollapplyr(., 3, mean, partial = TRUE)), stat:day)。partial=TRUE参数导致在开头采用部分均值,即输出变为c( mean(x[1]), mean(x[1:2]), mean(x[1:3]), mean(x[2:4]), ..., mean(x[(n-2):n]) )还要注意 rollapplyr 末尾的 r。