如何计算分区内的百分比变化? - R.

时间:2015-11-20 02:30:15

标签: r partition calculated-field

我有一系列的效果指标,并希望计算上一行但在定义的分区内的百分比变化,如下所示:

   index metric percent_change
   A     10     0.0
   A     20     1.0
   A     10     -.50
   A     5      -.50
   B     10     0
   B     5      -.50
   B     10     1.00

我如何在R?

中完成此任务

2 个答案:

答案 0 :(得分:0)

我们可以使用data.table。转换' data.frame'到' data.table' (setDT(df1)),按'索引'分组,我们减去'填充'从填充的延迟'并除以它并将结果(:=)分配给创建' percent_change'。

library(data.table)#v1.9.6+
setDT(df1)[, percent_change := {tmp <- shift(metric, fill=metric[1L])
                 (metric-tmp)/tmp} , by =  index]
df1
#   index metric percent_change
#1:     A     10            0.0
#2:     A     20            1.0
#3:     A     10           -0.5
#4:     A      5           -0.5
#5:     B     10            0.0
#6:     B      5           -0.5
#7:     B     10            1.0

或使用dplyr

library(dplyr)
df1 %>%
     group_by(index) %>%
     mutate(percent_change = (metric- lag(metric, default=metric[1L]))/lag(metric, default=metric[1L]))

数据

df1 <- structure(list(index = c("A", "A", "A", "A", "B", "B", "B"), 
metric = c(10L, 20L, 10L, 5L, 10L, 5L, 10L)), .Names = c("index", 
"metric"), 
 row.names = c(NA, -7L), class = "data.frame")

答案 1 :(得分:0)

使用基础包的另一种选择:

df1$percent_change <- unlist(
tapply(df1$metric, df1$index, function(x) c(0, x[-1]/x[1]-1) )
)

或者与rawr提出的非常相似

df1$percent_change <- ave(df1$metric, df1$index, FUN=function(x) c(0,x[-1]/x[1]-1))

输出:

  index metric percent_change
1     A     10            0.0
2     A     20            1.0
3     A     10            0.0
4     A      5           -0.5
5     B     10            0.0
6     B      5           -0.5
7     B     10            0.0