R 连续列之间的百分比变化

R 连续列之间的百分比变化,r,purrr,R,Purrr,寻找聪明的方法来自动创建具有相同前缀的连续变量之间的百分比变化列。我还想为每个第二个变量创建类似的变量。我们可以假设这些变量代表年份,我们希望每年和第二年之间的百分比变化 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

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

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 %>% 
  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 
df%>%
枢轴长度(-xx)%>%
分组依据(xx)%>%
变异(差异=(值/滞后(值)-1)*100)%>%
pivot(id\u cols=xx,names\u from=name,values\u from=Diff,names\u prefix=“Diff”)%>%
左联合(df)%>%
选择(xx,以(“a”)开头,一切()
通过=“xx”加入
#一个tibble:3x11
#组别:xx[3]
xx a_12 a_13 a_14 a_15 a_16 diff_12 diff_13 diff_14 diff_15 diff_16
111030232523NA200-23.38.70-8.00
2 2 20 40 34 NA 100-15。0         0   
320105656NA-50460。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())
n\u滞后%
分组人(xx)
tmp%
选择(以“差异”开头)
绑定列(df长,tmp)%>%
支点更宽(
id_cols=xx,
name_from=name,
值\u from=以(“diff”)开始\u)%>%
左联合(df)%>%
选择(xx,以(“a”)开头,一切()
这样试试看

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 
df%>%
枢轴长度(-xx)%>%
分组依据(xx)%>%
变异(差异=(值/滞后(值)-1)*100)%>%
pivot(id\u cols=xx,names\u from=name,values\u from=Diff,names\u prefix=“Diff”)%>%
左联合(df)%>%
选择(xx,以(“a”)开头,一切()
通过=“xx”加入
#一个tibble:3x11
#组别:xx[3]
xx a_12 a_13 a_14 a_15 a_16 diff_12 diff_13 diff_14 diff_15 diff_16
111030232523NA200-23.38.70-8.00
2 2 20 40 34 NA 100-15。0         0   
320105656NA-50460。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())
n\u滞后%
分组人(xx)
tmp%
选择(以“差异”开头)
绑定列(df长,tmp)%>%
支点更宽(
id_cols=xx,
name_from=name,
值\u from=以(“diff”)开始\u)%>%
左联合(df)%>%
选择(xx,以(“a”)开头,一切()