dplyr:`group_by`和`mutate_each`错误

dplyr:`group_by`和`mutate_each`错误,r,dplyr,R,Dplyr,我很难弄清楚为什么我的dplyr group_by/mutate_每个函数都被炸了。当我使用默认的n=2运行mutate_时,它会工作。这两种情况都不适用于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)

我很难弄清楚为什么我的dplyr group_by/mutate_每个函数都被炸了。当我使用默认的n=2运行mutate_时,它会工作。这两种情况都不适用于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 <- function(mycol, n=2) {
  require(zoo)
  mycol <- na.locf(mycol, na.rm=FALSE)
  if(length(mycol) < n) 
    return(as.double(mycol))
  c(mycol[1:(n-1)], rollapply(mycol, width=n, mean, align="right"))
}

虽然这并不等同于您所拥有的,但您真正想要的可能是:dummy%>%group\u byName2%>%mutate\u eachfunsrollappyr.,3,mean,partial=TRUE,stat:day。partial=TRUE参数导致在开始时采用部分平均值,即输出变为c meanx[1],meanx[1:2],meanx[1:3],meanx[2:4],…,meanx[n-2:n]还请注意rollapplyr末尾的r。
get.mavg <- function(mycol, n=2) {
  require(zoo)
  mycol <- na.locf(mycol, na.rm=FALSE)
  if(length(mycol) < n) 
    return(as.double(mycol))
  c(mycol[1:(n-1)], rollapply(mycol, width=n, mean, align="right"))
}
dummy %>%
  group_by(Name2) %>%
  mutate_each(funs(get.mavg(.,3)), stat:day)
Source: local data frame [7 x 4]
Groups: Name2 [2]

  Name1 Name2      stat      day
  (chr) (chr)     (dbl)    (dbl)
1     A     B  0.000000 1.000000
2     A     B  5.000000 2.000000
3     A     C  5.000000 3.000000
4     A     C 10.000000 4.000000
5     B     C  8.333333 2.666667
6     B     C  8.333333 2.333333
7     B     C  6.666667 2.000000