如何计算分区内的百分比变化?-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