除了某些列外,全部进行突变

10

我有一个包含一组变量的数据框,我希望将它们以不同的长度进行滞后,以便稍后在回归中使用它们(而不是手动逐个滞后一个变量)。

我在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

问题在于这会使每一列都有延迟,而我有些列并不想要有延迟。我该如何修改上述代码以使我不希望有延迟的列被排除?另外,我该如何更改不同的延迟长度,现在它只是按默认设置延迟1。

2个回答

20

我一直在谷歌搜索同一个问题和答案,然后注意到 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

4

可以查看 mutate_atmutate_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

这个示例创建于2020年04月20日,使用了reprex包(v0.3.0)。


我尝试了对于我想要的列使用代码df%>% mutate_at(c(“b”),lag,4),但它似乎根本没有起作用。我分配给此代码的新数据框与应用代码之前的数据框完全相同(lags)。 - Andycode
@Andycode最好在你的问题中展示你真实的数据集和迄今为止尝试过的代码。 - Frank Zhang
macro_2 <- macro %>% mutate_at(c("inc_ldiff","unem_ldiff", "hp_ldiff", "int_diff", "m1_ldiff"),lag,2) 这是我应用的代码。Macro是我的宏变量数据框,其中包含日期列、季度列、年份列和一些虚拟列。然而,它没有对我数据框中选择的列做任何事情。 - Andycode
@Andycode,你可以尝试将lag更改为dplyr::lag,看看是否有帮助? - Frank Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接