2017-08-10 3 views
0

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] 
      } 
     } 
     } 
+0

Que faire lorsque 'v2' est disponible en plusieurs années? – CPak

+0

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

+0

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

Répondre

0

Essayez ceci:

DT[, v2:= Reduce(`*`, v1[-1], init=v2[1], acc=TRUE), by=.(x, cumsum(!is.na(v2)))] 

#  x year  v1  v2 
# 1: a 2012 0.8501072  NA 
# 2: a 2013 1.0926093 39.36505 
# 3: a 2014 1.2084379 47.57022 
# 4: a 2015 0.8921997 42.44213 
# 5: a 2016 0.8023251 34.05239 
# 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 40.28108 
# 14: c 2015 1.0295864 15.04948 
# 15: c 2016 0.8812966 13.26306 
+0

C'est génial. Je ne comprends vraiment pas comment ou pourquoi cela fonctionne, ou comment j'aurais pu le faire tout seul. Il est temps de vraiment lire les manuels. (J'ai commencé à travailler chez R il y a une semaine, après 35 ans de travail chez SAS, d'une manière ou d'une autre, c'est lié à 'Retain' chez SAS.) – ejb