我无法弄清楚为什么我的 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)
Error: incompatible types, expecting a integer vector
如果我尝试将各列单独传递给我的移动平均函数,它会起作用!
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
发生什么事了?
最佳答案
有a bug如果混合使用 double 型和数字型,则会出现错误。我认为这是你的问题。
如果您更改函数,请确保始终返回 double 值:
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
关于r - dplyr: `group_by` 和 `mutate_each` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34108527/