我有一个带有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) )
不幸的是,它没有做到这一点。
任何帮助都将不胜感激。
答案 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)