【问题标题】:percentage change between consective columns连续列之间的百分比变化
【发布时间】:2020-09-23 15:00:47
【问题描述】:

寻找巧妙的方法在具有相同前缀的连续变量之间自动创建百分比变化列。我还想为每个第二个变量创建类似的变量。我们可以假设这些变量代表年份,我们希望每年和每两年之间的百分比变化。

library(tidyverse)
df <- data.frame(xx   = c(1, 2, 3),
                 a_12 = c(10, 20, 20),
                 a_13 = c(30, 40, 10),
                 a_14 = c(23, 34, 56),
                 a_15 = c(25, 34, 56),
                 a_16 = c(23, 34, 56))
df
#   xx a_12 a_13 a_14 a_15 a_16
# 1  1   10   30   23   23   23
# 2  2   20   40   34   34   34
# 3  3   20   10   56   56   56

我想要的是自动化以下操作:

df %>% 
  mutate(a_diff_12_13 = ((a_13 - a_12)/a_12)*100,
         a_diff_13_14 = ((a_14 - a_13)/a_13)*100,
         a_diff_14_15 = ((a_15 - a_14)/a_14)*100,
         #ALSO EVERY SECOND YEAR
         a_diff_12_14 = ((a_14 - a_12)/a_12)*100,
         a_diff_14_16 = ((a_16 - a_14)/a_14)*100)
#   xx a_12 a_13 a_14 a_15 a_16 a_diff_12_13 a_diff_13_14 a_diff_14_15 a_diff_12_14 a_diff_14_16
# 1  1   10   30   23   25   23          200        -23.3          8.7          130            0
# 2  2   20   40   34   34   34          100        -15.0          0.0           70            0
# 3  3   20   10   56   56   56          -50        460.0          0.0          180            0

谢谢

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    试试这个方法

    df %>% 
      pivot_longer(-xx) %>% 
      group_by(xx) %>% 
      mutate(Diff = (value / lag(value) - 1) * 100) %>% 
      pivot_wider(id_cols = xx, names_from = name, values_from = Diff, names_prefix = "diff_") %>% 
      left_join(df) %>% 
      select(xx, starts_with("a"), everything())
    
    Joining, by = "xx"
    # A tibble: 3 x 11
    # Groups:   xx [3]
         xx  a_12  a_13  a_14  a_15  a_16 diff_a_12 diff_a_13 diff_a_14 diff_a_15 diff_a_16
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
    1     1    10    30    23    25    23        NA       200     -23.3      8.70     -8.00
    2     2    20    40    34    34    34        NA       100     -15.       0         0   
    3     3    20    10    56    56    56        NA       -50     460.       0         0 
    

    或者你可以做到

    n_lag <- seq(1,2)
    
    df_long <- df %>% 
      pivot_longer(-xx) %>% 
      group_by(xx)
     
    
    tmp <- map_dfc(
      n_lag,
      ~ transmute(df_long, !!paste0("diff_", .x) := (value / lag(value, .x) - 1) * 100)) %>% 
      select(starts_with("diff_"))
    
    
    bind_cols(df_long, tmp) %>% 
      pivot_wider(
        id_cols = xx,
        names_from = name,
        values_from = starts_with("diff_")) %>% 
      left_join(df) %>% 
      select(xx, starts_with("a"), everything())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2020-10-19
      • 2021-02-04
      • 2017-10-03
      • 1970-01-01
      相关资源
      最近更新 更多