我有下面提到的数据帧:
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之后Val1和Per_2之后添加两列Val2.将2月17日数据与1月17日数据进行比较,并给出增长百分比(增加或减少).
注意:对于A,B,C,D和E,序列在2月17日和1月17日会有所不同,这里我想分别计算1月-17 A和2月17日A的增长情况.
在一月-17的情况下,因为在上个月没有数据在数据帧相比,在Per_1与Per_2应0.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)
这可以用dplyr和完成lead
我创建了一个单独的列ID,用每个月替换一个常量值,这样我们就可以group_by在每个月都有一个一致的类别.然后我通过使用创建了Per_1和Per_2列lead.最后,我选择了您想要返回的列,不包括任何中间列.
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)