【问题标题】:rollmean with dplyr and magrittrrollmean 与 dplyr 和 magrittr
【发布时间】:2014-11-06 16:28:22
【问题描述】:

给定以下数据:

    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 设置。滚动平均值应作为新列添加到 data.frame。

我想使用 magrittr 和 dplyr。我试过了

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

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

如何填充前两行?

【问题讨论】:

    标签: r zoo dplyr magrittr


    【解决方案1】:

    这可能会有所帮助:

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

    如果您想同时处理两个列,u 和 v

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

    【讨论】:

    • 太棒了!如果 t 没有正确排序,我使用 data %>% group_by(o) %>%arrange(o,t) %>% mutate(rM=rollmean(u,3, na.pad=TRUE, align="right" ))
    • @JerryWho 是的,您可以在未订购时使用arrange。
    • 你应该在library(dplyr)下面添加library(zoo),因为rollmean是动物园的一部分(或者你可以将它显示为zoo::rollmean(...)
    【解决方案2】:

    rowr 包提供了更灵活的包装器。这允许在您的初始数据中使用不同大小的窗口。

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

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 1970-01-01
      • 2019-06-04
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多