And*_*ode 11 regression r dataframe dplyr
我有一个包含一组变量的数据框,我想将它们滞后于不同的长度,以便稍后可以在回归中使用它们(而不是手动一次滞后一个变量)。
我在 Stackoverflow 上发现了这段代码,似乎可以解决这个问题:
df = data.frame(a = 1:10, b = 21:30)
dplyr::mutate_all(df, lag)
a b
1 NA NA
2 1 21
3 2 22
4 3 23
5 4 24
6 5 25
7 6 26
8 7 27
9 8 28
10 9 29
Run Code Online (Sandbox Code Playgroud)
问题是这会滞后于每一列,而我有一些列我不想被滞后。如何调整上述代码以便排除我不想滞后的列?另外我如何滞后不同的长度,现在默认设置仅滞后 1
mac*_*mac 22
我不断在谷歌上搜索相同的问答,然后注意到mutate_at()和mutate_if()现在被 取代across(),它为“突变除这些列之外的所有列”模式提供了一种稍微容易记住的方法
df = data.frame(a = 1:10, b = 21:30, c=31:40, d=41:50)
> df
a b c d
1 1 21 31 41
2 2 22 32 42
3 3 23 33 43
4 4 24 34 44
5 5 25 35 45
6 6 26 36 46
7 7 27 37 47
8 8 28 38 48
9 9 29 39 49
10 10 30 40 50
> # everythng but columns b and c
> df %>% mutate(across(!b & !c, lag))
a b c d
1 NA 21 31 NA
2 1 22 32 41
3 2 23 33 42
4 3 24 34 43
5 4 25 35 44
6 5 26 36 45
7 6 27 37 46
8 7 28 38 47
9 8 29 39 48
10 9 30 40 49
Run Code Online (Sandbox Code Playgroud)
看看mutate_at或者mutate_if
library(dplyr)
df = tibble(a = LETTERS[1:10], b = 21:30,c=31:40)
#exclude column a
df %>%
mutate_at(vars(-("a")),lag)
#> # A tibble: 10 x 3
#> a b c
#> <chr> <int> <int>
#> 1 A NA NA
#> 2 B 21 31
#> 3 C 22 32
#> 4 D 23 33
#> 5 E 24 34
#> 6 F 25 35
#> 7 G 26 36
#> 8 H 27 37
#> 9 I 28 38
#> 10 J 29 39
#only column b
df %>%
mutate_at(c("b"),lag,4)
#> # A tibble: 10 x 3
#> a b c
#> <chr> <int> <int>
#> 1 A NA 31
#> 2 B NA 32
#> 3 C NA 33
#> 4 D NA 34
#> 5 E 21 35
#> 6 F 22 36
#> 7 G 23 37
#> 8 H 24 38
#> 9 I 25 39
#> 10 J 26 40
#only character column
df %>%
mutate_if(is.character,lag,3)
#> # A tibble: 10 x 3
#> a b c
#> <chr> <int> <int>
#> 1 <NA> 21 31
#> 2 <NA> 22 32
#> 3 <NA> 23 33
#> 4 A 24 34
#> 5 B 25 35
#> 6 C 26 36
#> 7 D 27 37
#> 8 E 28 38
#> 9 F 29 39
#> 10 G 30 40
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v0.3.0)于 2020-04-20 创建