计算R数据帧中的增长百分比

Roy*_*245 6 r dataframe dplyr

我有下面提到的数据帧:

Month         Val1          Val2      Part1      Part2
Feb-17        250           10000     25         100
A             25            2000      5          20
B             25            2000      5          20
C             100           2000      5          20
D             10            2000      5          20
E             40            2000      5          20
Jan-17        200           8000     50         100
A             20            1000      10         20
B             40            1600      10         20
C             100           1600      10         20
D             20            1600      10         20
E             20            2200      10         20
Run Code Online (Sandbox Code Playgroud)

我想在Per_1之后Val1Per_2之后添加两列Val2.将2月17日数据与1月17日数据进行比较,并给出增长百分比(增加或减少).

注意:对于A,B,C,D和E,序列在2月17日和1月17日会有所不同,这里我想分别计算1月-17 A和2月17日A的增长情况.

在一月-17的情况下,因为在上个月没有数据在数据帧相比,在Per_1Per_20.00%在这种情况下.

要求输出:

Month   Val1    Per_1   Val2    Per_2   Part1   Part2
Feb-17  250     25.00%  10000   25.00%  25  100
A       25      25.00%  2000    100.00% 5   20
B       25     -37.50%  2000    25.00%  5   20
C       100     0.00%   2000    25.00%  5   20
D       10     -50.00%  2000    25.00%  5   20
E       40      100.00% 2000    -9.09%  5   20
Jan-17  200     0.00%   8000    0.00%   50  100
C       100     0.00%   1600    0.00%   10  20
A       20      0.00%   1000    0.00%   10  20
B       40      0.00%   1600    0.00%   10  20
E       20      0.00%   2200    0.00%   10  20
D       20      0.00%   1600    0.00%   10  20
Run Code Online (Sandbox Code Playgroud)

jas*_*ner 5

这可以用dplyr和完成lead

我创建了一个单独的列ID,用每个月替换一个常量值,这样我们就可以group_by在每个月都有一个一致的类别.然后我通过使用创建了Per_1Per_2lead.最后,我选择了您想要返回的列,不包括任何中间列.

library(dplyr)
df %>% 
  mutate(ID = ifelse(grepl("\\d",Month),"First",Month)) %>% 
  group_by(ID) %>% 
  mutate(Val1 = as.numeric(Val1),
         Val2 = as.numeric(Val2), 
         next.month1 = lead(Val1, order_by=ID) ,
         next.month2 = lead(Val2, order_by=ID), 
         Per_1 = 100*(Val1-next.month1)/next.month1,
         Per_2 = 100*(Val2-next.month2)/next.month2) %>%
  ungroup() %>% 
  select(Month,Val1,Per_1,Val2,Per_2,Part1,Part2)


# A tibble: 12 x 7
#   Month   Val1  Per_1  Val2   Per_2 Part1 Part2
#   <fct>  <dbl>  <dbl> <dbl>   <dbl> <int> <int>
# 1 Feb-17 250     25.0 10000   25.0     25   100
# 2 A       25.0   25.0  2000  100        5    20
# 3 B       25.0 - 37.5  2000   25.0      5    20
# 4 C      100      0    2000   25.0      5    20
# 5 D       10.0 - 50.0  2000   25.0      5    20
# 6 E       40.0  100    2000 -  9.09     5    20
# 7 Jan-17 200     NA    8000   NA       50   100
# 8 C      100     NA    1600   NA       10    20
# 9 A       20.0   NA    1000   NA       10    20
#10 B       40.0   NA    1600   NA       10    20
#11 E       20.0   NA    2200   NA       10    20
#12 D       20.0   NA    1600   NA       10    20
Run Code Online (Sandbox Code Playgroud)