滑块包和分组数据
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
两个关键要素:
- 必须按照方案
nest %>% mutate(map) %>% unnest
进行变异。
- 您必须使用
across
函数在列中滑动。
请注意,由于数据量小,我只制作了 before = 2
的幻灯片,这里是 ~f(.x, 2)
.
我正在使用滑块包计算每列的 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
两个关键要素:
- 必须按照方案
nest %>% mutate(map) %>% unnest
进行变异。 - 您必须使用
across
函数在列中滑动。 请注意,由于数据量小,我只制作了before = 2
的幻灯片,这里是~f(.x, 2)
.