使用dplyr和magrittr进行滚动平均

15

给定以下数据:

    set.seed(1)
    data <- data.frame(o=c('a','a','a','a','b','b','b','b','c','c','c','c'), t=c(1,2,3,4,1,2,3,4,1,2,3,4), u=runif(12), v=runif(12))
    data
       o t          u         v
    1  a 1 0.26550866 0.6870228
    2  a 2 0.37212390 0.3841037
    3  a 3 0.57285336 0.7698414
    4  a 4 0.90820779 0.4976992
    5  b 1 0.20168193 0.7176185
    6  b 2 0.89838968 0.9919061
    7  b 3 0.94467527 0.3800352
    8  b 4 0.66079779 0.7774452
    9  c 1 0.62911404 0.9347052
    10 c 2 0.06178627 0.2121425
    11 c 3 0.20597457 0.6516738
    12 c 4 0.17655675 0.1255551

我希望能够按照列o定义的组对u进行滚动均值计算(使用zoo包)。 滚动均值的顺序由t设置。 滚动均值应作为新列添加到数据框中。

我想使用magrittr和dplyr。 我尝试了:

    data %>%
      group_by(o) %>%
      sort(t) %>%
      select(u) %>%
      rollmean(3) %>%
      rbind

但这样做行不通。是否可以使用magrittr和dplyr来完成,还是必须一步一步地进行?在我的真实数据中,o和t的值是可变的。

如何填充前两行?

2个回答

22

也许这会有所帮助:

library(dplyr)
library(zoo)
data %>%
group_by(o) %>%
mutate(rM=rollmean(u,3, na.pad=TRUE, align="right"))

如果您想要对两个栏进行操作,分别为 uv

fun1 <- function(x) rollmean(x, 3, na.pad=TRUE, align="right")
data %>% 
group_by(o) %>% 
mutate_each(funs(fun1), u, v)

1
太好了!如果t没有正确排序,我会使用data %>% group_by(o) %>% arrange(o,t) %>% mutate(rM=rollmean(u,3, na.pad=TRUE, align="right"))。 - JerryWho
@JerryWho 是的,即使未排序,您也可以使用 arrange - akrun
1
应该在library(dplyr)下面添加library(zoo),因为rollmeanzoo的一部分(或者可以写成zoo::rollmean(...)显示)。 - Brent Brewington

2

更灵活的包装来自于rowr包。这允许在您的初始数据中使用不同大小的窗口。

data %>% 
group_by(o) %>% 
mutate(MEANS = rollApply(u, fun=mean, window=3, align='right'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接