代码之家  ›  专栏  ›  技术社区  ›  Hedgehog

tidyr/dplyr:将自定义多参数函数应用于滚动窗口

  •  1
  • Hedgehog  · 技术社区  · 8 年前

    我想传递一些列的滚动窗口一个自定义函数,以及其他列的实际值。

    给出了示例数据和示例函数。 应用 myfunc 滚动窗口,尺寸3,变量 var1 var2 以及 param1 param2 .

    例子: 为世界其他地区 2015-07-03 这个 Myfunc公司 传递函数:

    • var1=c(1.18,1.27, 1.36)
    • param1=3
    • var2=c(3.55,3.82,4.09)
    • param2=13

    示例数据

    library(dplyr)
    
    myfunc <- function(var1, param1, var2, param2){
      c(length(var1), length(var2), param1, param2)
    }
    
    d <- data_frame(date = seq(as.Date('2015-07-01'), as.Date('2015-07-12'), by = '1 day'))
    d <- d %>%
      mutate(var1   = seq(1,2, length=12), 
             var2   = seq(3,6, length=12),
             param1 = rep(seq(1,3, length=3),4),
             param2 = rep(seq(11,13, length=3),4))
    
    >d
      # A tibble: 12 x 5
      date       param1 param2  var1  var2
    <date>      <dbl>  <dbl> <dbl> <dbl>
      1 2015-07-01      1     11  1     3   
    2 2015-07-02      2     12  1.09  3.27
    3 2015-07-03      3     13  1.18  3.55
    4 2015-07-04      1     11  1.27  3.82
    5 2015-07-05      2     12  1.36  4.09
    6 2015-07-06      3     13  1.45  4.36
    7 2015-07-07      1     11  1.55  4.64
    8 2015-07-08      2     12  1.64  4.91
    9 2015-07-09      3     13  1.73  5.18
    10 2015-07-10      1     11  1.82  5.45
    11 2015-07-11      2     12  1.91  5.73
    12 2015-07-12      3     13  2     6   
    

    期望输出:

    # A tibble: 12 x 4
    date       param1 param2  res  
    <date>      <dbl>  <dbl> <lst> 
    1 2015-07-01      1     11  <..>     
    2 2015-07-02      2     12  <..>   
    3 2015-07-03      3     13  <..>   
    4 2015-07-04      1     11  <..>   
    5 2015-07-05      2     12  <..>   
    6 2015-07-06      3     13  <..>  
    7 2015-07-07      1     11  <..>   
    8 2015-07-08      2     12  <..>   
    9 2015-07-09      3     13  <..>  
    10 2015-07-10      1     11  <..>   
    11 2015-07-11      2     12  <..>   
    12 2015-07-12      3     13  <..>     
    

    排在哪里 2015年7月3日 的内容 d$res 3,3,3,13

    1 回复  |  直到 7 年前
        1
  •  0
  •   Sotos    7 年前

    下面是一个使用 rollapply 函数来自 zoo 包裹。我通过移除 length (这基本上使函数不必要,但我将使用它作为参考),因为我通过 滚动应用 ,即

     myfunc <- function(var1, param1, var2, param2) {
         c(var1, var2, param1, param2)
     }
    
    library(zoo)
    library(tidyverse)
    
    d %>% 
     mutate(newvar1 = rollapply(var1, width = 3, FUN = length, partial = TRUE), 
            newvar2 = rollapply(var2, width = 3, FUN = length, partial = TRUE)) %>% 
     rowwise() %>% 
     mutate(res = list(myfunc(newvar1, newvar2, param1, param2)))
     #or mutate(res = list(c(newvar1, ...)))
    

    这给了,

    # A tibble: 12 x 8
       date        var1  var2 param1 param2 newvar1 newvar2 res      
       <date>     <dbl> <dbl>  <dbl>  <dbl>   <int>   <int> <list>   
     1 2015-07-01  1     3         1     11       2       2 <dbl [4]>
     2 2015-07-02  1.09  3.27      2     12       3       3 <dbl [4]>
     3 2015-07-03  1.18  3.55      3     13       3       3 <dbl [4]>
     4 2015-07-04  1.27  3.82      1     11       3       3 <dbl [4]>
     5 2015-07-05  1.36  4.09      2     12       3       3 <dbl [4]>
     6 2015-07-06  1.45  4.36      3     13       3       3 <dbl [4]>
     7 2015-07-07  1.55  4.64      1     11       3       3 <dbl [4]>
     8 2015-07-08  1.64  4.91      2     12       3       3 <dbl [4]>
     9 2015-07-09  1.73  5.18      3     13       3       3 <dbl [4]>
    10 2015-07-10  1.82  5.45      1     11       3       3 <dbl [4]>
    11 2015-07-11  1.91  5.73      2     12       3       3 <dbl [4]>
    12 2015-07-12  2     6         3     13       2       2 <dbl [4]>
    

    第三排在哪里?

    d2$res[3]
    #[[1]]
    #[1]  3  3  3 13
    

    注: 您可以添加 select 在管道末端和移除 newvar*