J'ai une table de données avec une colonne v2 avec des 'valeurs initiales' et une colonne v1 avec un taux de croissance. Je voudrais extrapoler v2 depuis des années la valeur disponible, en augmentant la valeur précédente par le facteur v1. Dans la notation 'série temporelle' v2 (t + 1) = v2 (t) * v1 (t), étant donné un v2 (0). Le problème est que l'année de la valeur initiale peut varier selon le groupe x de l'ensemble de données. Dans certains groupes, v2 peut être disponible dans plusieurs années, ou pas du tout. De plus, le nombre d'années par groupe peut varier (panel déséquilibré). L'utilisation de la fonction de décalage n'aide pas, car elle déplace une fois v2 et ne fait pas référence à la valeur de mise à jour précédente.R équation de différence de données.table (données de panneaux dynamiques)
x year v1 v2
1: a 2012 0.8501072 NA
2: a 2013 1.0926093 39.36505
3: a 2014 1.2084379 NA
4: a 2015 0.8921997 NA
5: a 2016 0.8023251 NA
6: b 2012 1.1005287 NA
7: b 2013 1.0139800 NA
8: b 2014 1.1539676 NA
9: b 2015 1.2282501 NA
10: b 2016 0.8052265 NA
11: c 2012 0.8866425 NA
12: c 2013 0.9952566 44.30377
13: c 2014 0.9092020 NA
14: c 2015 1.0295864 15.04948
15: c 2016 0.8812966 NA
La valeur de V2, x = a, année = 2014 devrait être 39,36 * 1,208, et en 2015 cette réponse fois 0.89.
Le code suivant, dans un ensemble de boucles, de travaux et fait ce que je veux:
ivec<-unique(DT[,x])
for (i in 1:length(ivec)) {
tvec<-unique(DT[x==ivec[i] ,y])
for (t in 2:length(tvec)) {
if (is.na(DT[x==ivec[i] & y==tvec[t], v2])) {
DT[x==ivec[i] & y==tvec[t],v2:=DT[x==ivec[i] & y==tvec[(t-1)],v2]*v1]
}
}
}
Que faire lorsque 'v2' est disponible en plusieurs années? – CPak
Si plusieurs valeurs de v2 sont disponibles dans un groupe, seules les valeurs manquantes doivent être mises à jour et la version v2 suivante suivante démarre une nouvelle séquence de mise à jour. – ejb
Le code suivant, dans un ensemble de boucles, fonctionne et fait ce que je veux: ivec <-unique (DT [, x]) pour (i en 1: longueur (ivec)) { tvec <-unique (DT [x == ivec [i], y]) pour (t dans 2: longueur (tvec)) { if (est.na (DT [x == ivec [i] & y == tvec [t], v2])) { DT [x == ivec [i] & y == tvec [t], v2: = DT [x == ivec [i] & y == tvec [(t-1)], v2 ] * v1] } } } – ejb