对R来说还是很新的,所以在下面的解释中试着找出我做错了什么。
我试图计算数据帧的每个子组随时间的扩展平均值。当数据帧中只有一个子组时,我的代码有效,但当数据帧内有多个子组可用时,代码开始中断。
如果我忽略了一些东西,我很抱歉,但我不知道我的代码到底在哪里不正确。我的直觉是,我没有正确填写宽度,但我还没能弄清楚如何将宽度更改为每个子组随时间动态扩展的窗口。
请参阅下面的我的数据;样本文件
请参阅下面的代码;
library(ggplot2)
library(zoo)
library(RcppRoll)
library(dplyr)
x <- read.csv("stackoverflow.csv")
x$datatime <- as.POSIXlt(x$datatime,format="%m/%d/%Y %H:%M",tz=Sys.timezone())
x$Event <- as.factor(x$Event)
x2 <- arrange(x,x$Event,x$datatime) %>%
group_by(x$Event) %>%
mutate(ma=rollapply(data = x$Actual, width=seq_along(x$Actual), FUN=mean,
partial=TRUE, fill=NA,
align = "right"))
非常感谢您的帮助!
感谢
编辑:
已找到修复程序!感谢所有有用的反馈。
工作代码为;
x <-
arrange(x,x$Event,x$datatime) %>%
group_by(Event) %>%
mutate(ma=rollapply(data = Actual,
width=seq_along(Actual),
FUN=mean,
partial=TRUE,
fill=NA,
align = "right"))
我认为这里的问题是使用x$
从mutate()
中的原始数据,而不是直接使用列名以引用分组切片中的列。在dplyr谓词中,您可以(在分组操作的情况下,必须(直接引用列。解决方案是dplyr函数中代码中的所有x$
引用。
这里有一个小例子说明了发生了什么:
library(dplyr, warn.conflicts = FALSE)
tbl <- tibble(g = c(1, 1, 2, 2, 2), x = 1:5)
tbl
#> # A tibble: 5 x 2
#> g x
#> <dbl> <int>
#> 1 1 1
#> 2 1 2
#> 3 2 3
#> 4 2 4
#> 5 2 5
tbl %>%
group_by(g) %>%
mutate(y = cumsum(tbl$x))
#> Error in `mutate_cols()`:
#> ! Problem with `mutate()` column `y`.
#> i `y = cumsum(tbl$x)`.
#> i `y` must be size 2 or 1, not 5.
#> i The error occurred in group 1: g = 1.
以及如何修复:
tbl %>%
group_by(g) %>%
mutate(y = cumsum(x))
#> # A tibble: 5 x 3
#> # Groups: g [2]
#> g x y
#> <dbl> <int> <int>
#> 1 1 1 1
#> 2 1 2 3
#> 3 2 3 3
#> 4 2 4 7
#> 5 2 5 12