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

如何计算分区内的百分比变化?-R,r,partition,calculated-field,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中实现这一点?我们可以使用数据表。将'data.frame'转换为

我有一系列性能指标,并希望计算与前一行的百分比变化,但在定义的分区内,例如:

   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中实现这一点?

我们可以使用
数据表。将'data.frame'转换为'data.table'(
setDT(df1)
),按'index'分组,我们从'fill'的延迟中减去'fill'并除以它,然后将结果分配给创建'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
数据
df1我们可以使用
data.table
。将'data.frame'转换为'data.table'(
setDT(df1)
),按'index'分组,我们从'fill'的延迟中减去'fill'并除以它,然后将结果分配给创建'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
数据
df1使用基本包的另一种替代方案:

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

使用基本软件包的另一个备选方案:

df1$percent_change <- unlist(
tapply(df1$metric, df1$index, function(x) c(0, x[-1]/x[1]-1) )
)
同样
带有(df1,ave(公制,索引,FUN=函数(x)c(0,(尾部(x,-1)-头部(x,-1))/头部(x,-1)))
带有(df1,ave(公制,索引,FUN=函数(x)c(0,(尾部(x,-1)-头部(x,-1))/头部(x,-1)))
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