仅当跨行的ID相同时,才计算百分比更改变量

时间:2014-05-09 23:48:04

标签: r dataframe

我有一个带有KEY / ID列,年份列,两个变量V1和V2的数据帧。

KEY V1  V2  YEAR
1   10   5  1990
1   20  10  1991
1   30  15  1992   
2   40  20  1990
2   50  25  1991
2   60  30  1992

我想计算V1值从一年到另一年的百分比变化。也就是说,我想计算(V1 [i + 1] -V1 [i])/ V1 [i],但仅当KEY [i + 1]中的值等于KEY [i]的值时。如果它们不同,我想获得NA。

KEY V1  V2  YEAR  CHANGE
1   10   5  1990    1
1   20  10  1991    1
1   30  15  1992   NA   
2   40  20  1990    0.25
2   50  25  1991    0.2
2   60  30  1992   NA

这是我尝试使用quantmode包中的Delt函数和plyr中的ddply。

data$change <- ddply(data, "data$KEY", transform,  DeltaCol=Delt(data$V1) )

不幸的是,它没有做到这一点。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我不知道如何使用ddply来完成它,但使用ave非常简单:

> dat$pctchg <- ave(dat$V1, dat$KEY, FUN=function(x) c( NA, diff(x)/x[-length(x)])  )
> dat
  KEY V1 V2 YEAR pctchg
1   1 10  5 1990     NA
2   1 20 10 1991   1.00
3   1 30 15 1992   0.50
4   2 40 20 1990     NA
5   2 50 25 1991   0.25
6   2 60 30 1992   0.20
当您希望结果仅依赖于任意数量类别中的一个向量时,

ave可以正常工作。据我所知,您不能使用ave进行多次矢量计算,也无法访问hte函数中的因子级别。如果您想对分别考虑的所有一组向量进行相同的计算,那么aggregate是最好的;最后,如果你想要每个依赖于多个向量的计算,可以使用do.call(rbvind, by(dat ,cats, function))lapply( split(dat, cats), function)