滑块包和分组数据

Slider package and grouped data

我正在使用滑块包计算每列的 10 年移动平均值。我有许多具有不同 ID 的流计,它们是分组数据。所以计算 应该从每个新的仪表重新开始。每个的前 9 个将为 NULL。我收到错误

        50: Problem with `mutate()` column `decade`. 
        `decade = slider::slide_int(...)`
        argument is not numeric or logical: returning NA
        The warning occurred in group 2: GaugeID = "01022500".

我尝试过使用幻灯片、slide_dbl_ 和 slide_int。密码是

        library(slider)
        library(tidyverse)
        test = elasticity %>% group_by(GaugeID) %>% dplyr::mutate(decade = slider::slide_int(
        .x = cur_data(), 
        .f = ~mean(Precip ~Et, .x), 
        .before = 9, 
        .complete = TRUE))

我的数据是数字

    > str(elasticity)
    grouped_df [22,377 x 6] (S3: grouped_df/tbl_df/tbl/data.frame)
     $ GaugeID: chr [1:22377] "01013500" "01013500" "01013500" "01013500" ...
     $ WATERYR: num [1:22377] 1981 1982 1983 1984 1985 ...
     $ Precip : num [1:22377] 1.002 1.001 0.997 0.995 1.005 ...
     $ Temp   : num [1:22377] 144.04 4.69 -2.92 10.47 9.72 ...
     $ Pet    : num [1:22377] 0.998 1 0.995 0.989 1.008 ...
     $ Et     : num [1:22377] 0.999 0.998 0.995 0.991 1.009 ..

数据样本

        # A tibble: 20 x 6
        # Groups:   GaugeID [1]
           GaugeID  WATERYR Precip    Temp   Pet    Et
           <chr>      <dbl>  <dbl>   <dbl> <dbl> <dbl>
         1 01013500    1981  1.00   144.   0.998 0.999
         2 01013500    1982  1.00     4.69 1.00  0.998
         3 01013500    1983  0.997   -2.92 0.995 0.995
         4 01013500    1984  0.995   10.5  0.989 0.991
         5 01013500    1985  1.01     9.72 1.01  1.01 
         6 01013500    1986  1.00     4.32 1.00  1.00 
         7 01013500    1987  1.00    12.2  1.01  1.01 
         8 01013500    1988  1.00   -73.2  1.01  1.01 
         9 01013500    1989  1.00     8.85 1.00  1.00 
        10 01013500    1990  1.00     5.44 1.01  1.01 
        11 01013500    1991  0.996 -139.   0.992 0.990
        12 01013500    1992  0.999    4.22 0.998 0.999
        13 01013500    1993  1.00     4.20 1.01  1.01 
        14 01013500    1994  0.997    2.65 0.994 0.996
        15 01013500    1995  1.00   -14.1  1.01  1.01 
        16 14400000    2000  1.00  -35.1  1.00  1.00 
        17 14400000    2001  1.01  -85.9  1.02  1.02 
        18 14400000    2002  0.998 -47.3  1.00  0.997
        19 14400000    2003  0.998 -15.1  0.997 0.991
        20 14400000    2004  1.00  -12.2  1.00  0.999

如有任何建议,我们将不胜感激。

希望我能很好地理解您的意图。 看起来你想做的比你尝试的要复杂一些。
你的数据:

library(tidyverse)
library(slider)

df = read.table(
  header = TRUE,text="
Id  GaugeID  WATERYR Precip    Temp   Pet    Et
1 01013500    1981  1.00   144.   0.998 0.999
2 01013500    1982  1.00     4.69 1.00  0.998
3 01013500    1983  0.997   -2.92 0.995 0.995
4 01013500    1984  0.995   10.5  0.989 0.991
5 01013500    1985  1.01     9.72 1.01  1.01 
6 01013500    1986  1.00     4.32 1.00  1.00 
7 01013500    1987  1.00    12.2  1.01  1.01 
8 01013500    1988  1.00   -73.2  1.01  1.01 
9 01013500    1989  1.00     8.85 1.00  1.00 
10 01013500    1990  1.00     5.44 1.01  1.01 
11 01013500    1991  0.996 -139.   0.992 0.990
12 01013500    1992  0.999    4.22 0.998 0.999
13 01013500    1993  1.00     4.20 1.01  1.01 
14 01013500    1994  0.997    2.65 0.994 0.996
15 01013500    1995  1.00   -14.1  1.01  1.01 
16 14400000    2000  1.00  -35.1  1.00  1.00 
17 14400000    2001  1.01  -85.9  1.02  1.02 
18 14400000    2002  0.998 -47.3  1.00  0.997
19 14400000    2003  0.998 -15.1  0.997 0.991
20 14400000    2004  1.00  -12.2  1.00  0.999
") %>% as_tibble()

一个程序来完成你的工作

f = function(data, before) data %>% 
  mutate(across(Precip:Et, 
                ~ slide_dbl(.x, ~mean(.x), 
                            .before = before, 
                            .complete = TRUE),  
                .names = "slide_{.col}"))

df %>% group_by(GaugeID) %>% 
  nest() %>% 
  mutate(decade = map(data, ~f(.x, 2))) %>% 
  unnest(c(decade))

输出

# A tibble: 20 x 12
# Groups:   GaugeID [2]
    GaugeID data                 Id WATERYR Precip    Temp   Pet    Et slide_Precip slide_Temp slide_Pet slide_Et
      <int> <list>            <int>   <int>  <dbl>   <dbl> <dbl> <dbl>        <dbl>      <dbl>     <dbl>    <dbl>
 1  1013500 <tibble [15 x 6]>     1    1981  1      144    0.998 0.999       NA          NA       NA       NA    
 2  1013500 <tibble [15 x 6]>     2    1982  1        4.69 1     0.998       NA          NA       NA       NA    
 3  1013500 <tibble [15 x 6]>     3    1983  0.997   -2.92 0.995 0.995        0.999      48.6      0.998    0.997
 4  1013500 <tibble [15 x 6]>     4    1984  0.995   10.5  0.989 0.991        0.997       4.09     0.995    0.995
 5  1013500 <tibble [15 x 6]>     5    1985  1.01     9.72 1.01  1.01         1.00        5.77     0.998    0.999
 6  1013500 <tibble [15 x 6]>     6    1986  1        4.32 1     1            1.00        8.18     1.00     1.00 
 7  1013500 <tibble [15 x 6]>     7    1987  1       12.2  1.01  1.01         1.00        8.75     1.01     1.01 
 8  1013500 <tibble [15 x 6]>     8    1988  1      -73.2  1.01  1.01         1         -18.9      1.01     1.01 
 9  1013500 <tibble [15 x 6]>     9    1989  1        8.85 1     1            1         -17.4      1.01     1.01 
10  1013500 <tibble [15 x 6]>    10    1990  1        5.44 1.01  1.01         1         -19.6      1.01     1.01 
11  1013500 <tibble [15 x 6]>    11    1991  0.996 -139    0.992 0.99         0.999     -41.6      1.00     1    
12  1013500 <tibble [15 x 6]>    12    1992  0.999    4.22 0.998 0.999        0.998     -43.1      1        1.00 
13  1013500 <tibble [15 x 6]>    13    1993  1        4.2  1.01  1.01         0.998     -43.5      1        1.00 
14  1013500 <tibble [15 x 6]>    14    1994  0.997    2.65 0.994 0.996        0.999       3.69     1.00     1.00 
15  1013500 <tibble [15 x 6]>    15    1995  1      -14.1  1.01  1.01         0.999      -2.42     1.00     1.01 
16 14400000 <tibble [5 x 6]>     16    2000  1      -35.1  1     1           NA          NA       NA       NA    
17 14400000 <tibble [5 x 6]>     17    2001  1.01   -85.9  1.02  1.02        NA          NA       NA       NA    
18 14400000 <tibble [5 x 6]>     18    2002  0.998  -47.3  1     0.997        1.00      -56.1      1.01     1.01 
19 14400000 <tibble [5 x 6]>     19    2003  0.998  -15.1  0.997 0.991        1.00      -49.4      1.01     1.00 
20 14400000 <tibble [5 x 6]>     20    2004  1      -12.2  1     0.999        0.999     -24.9      0.999    0.996

两个关键要素:

  1. 必须按照方案nest %>% mutate(map) %>% unnest进行变异。
  2. 您必须使用 across 函数在列中滑动。 请注意,由于数据量小,我只制作了 before = 2 的幻灯片,这里是 ~f(.x, 2).