【问题标题】:Mutate_all except some columnsmutate_all 除了一些列
【发布时间】:2020-08-02 22:11:11
【问题描述】:

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

我在 Stackoverflow 上发现了这个 code 似乎可以解决问题:

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

【问题讨论】:

    标签: r dataframe regression dplyr


    【解决方案1】:

    我一直在谷歌上搜索同样的问答,然后注意到 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
    

    【讨论】:

      【解决方案2】:

      看看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
      

      reprex package (v0.3.0) 于 2020-04-20 创建

      【讨论】:

      • 我为我想要的列尝试了 #only column b df %>% mutate_at(c("b"),lag,4) ,但它似乎根本没有做任何事情。我分配给此代码的新数据框看起来与应用 cod(滞后)之前的数据框完全相同
      • @Andycode 更好地显示您的真实数据集以及您迄今为止在问题中尝试过的代码。
      • macro_2 % mutate_at(c("inc_ldiff","unem_ldiff", "hp_ldiff", "int_diff", "m1_ldiff"),lag,2) 这是我应用的代码.宏是我的宏变量数据框,包含日期列、季度列、年份列和一些虚拟列。然而,它对我的​​数据框中的选定列没有做任何事情。
      • @Andycode,您可以尝试将lag 更改为dplyr::lag 看看是否有帮助?
      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 2015-08-09
      • 1970-01-01
      • 2019-11-28
      • 2019-10-07
      • 2019-03-17
      • 2017-06-09
      • 2023-03-08
      相关资源
      最近更新 更多