Вы можете использовать комбинацию plyr
для обработки группы с помощью операции с идентификатором, а quantmod
имеет функцию для процентного изменения, названную Delt
.
require(plyr)
require(quantmod)
> ddply(dat, "ID", transform, DeltaCol = Delt(Temp))
ID Date Temp X.Change Delt.1.arithmetic
1 AAA 1/1/2003 0.7498817 NA NA
2 AAA 1/2/2003 0.6666616 -0.11097769 -0.1109776868
3 AAA 1/3/2003 0.7730799 0.15962876 0.1596287574
4 AAA 1/4/2003 0.6290236 -0.18634075 -0.1863407501
5 AAA 1/5/2003 0.7333124 0.16579462 0.1657946178
6 BBB 1/1/2003 0.7073398 NA NA
7 BBB 1/2/2003 0.7649865 0.08149798 0.0814979813
8 BBB 1/3/2003 0.6622015 -0.13436192 -0.1343619242
9 BBB 1/4/2003 0.7744518 0.16951080 0.1695107963
10 BBB 1/5/2003 0.5082909 -0.34367645 -0.3436764522
11 CCC 1/1/2003 0.8368362 NA NA
12 CCC 1/2/2003 0.8371368 0.00035922 0.0003592196
13 CCC 1/3/2003 0.8090166 -0.03359092 -0.0335909235
14 CCC 1/4/2003 0.6902775 -0.14676969 -0.1467696849
15 CCC 1/5/2003 0.7963571 0.15367669 0.1536766860
Кроме того, вы можете пропустить бит plyr
, вычислить дельту для всего data.frame, а затем обновить первую строку для каждого идентификатора. Есть много хороших идей по выбору первой строки data.frame на основе идентификатора здесь . Что-то вроде этого, вероятно, будет работать:
dat$Delta <- Delt(dat$Temp)
dat[ diff(c(0,dat$ID)) != 0, 5] <- NA
В соответствующей заметке, если кто-то может объяснить, почему Delta, похоже, не принимает мою просьбу дать ей разумное название столбца, я был бы признателен.