我有一系列的效果指标,并希望计算上一行但在定义的分区内的百分比变化,如下所示:
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?
中完成此任务答案 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