2013-10-08 2 views
4

Ceci est lié à la question précédente sur le SO: roll data.table with rollendsrouleau data.table en avant et en arrière simultanément

Compte tenu des données ...

library(data.table) 

dt1 = data.table(Date=seq(from=as.Date("2013-01-03"), 
         to=as.Date("2013-06-27"), by="1 week"), 
      key="Date")[, ind:=.I] 
dt2 = data.table(Date=seq(from=as.Date("2013-01-01"), 
         to=as.Date("2013-06-30"), by="1 day"), 
      key="Date") 

j'essaie de porter les points de données hebdomadaires une jours avant et en arrière ...

dt1[dt2, roll=1][dt2, roll=-1] 

... mais seulement le premier rouleau se joindre à (en avant) semble fonctionner et roll=-1 est ignoré:

  Date ind 
    1: 2013-01-01 NA 
    2: 2013-01-02 NA 
    3: 2013-01-03 1 
    4: 2013-01-04 1 
    5: 2013-01-05 NA 
---    
177: 2013-06-26 NA 
178: 2013-06-27 26 
179: 2013-06-28 26 
180: 2013-06-29 NA 
181: 2013-06-30 NA 

Le même effet quand j'inverser l'ordre:

dt1[dt2, roll=-1][dt2, roll=1] 

      Date ind 
    1: 2013-01-01 NA 
    2: 2013-01-02 1 
    3: 2013-01-03 1 
    4: 2013-01-04 NA 
    5: 2013-01-05 NA 
---    
177: 2013-06-26 26 
178: 2013-06-27 26 
179: 2013-06-28 NA 
180: 2013-06-29 NA 
181: 2013-06-30 NA 

Je voudrais réaliser:

  Date ind 
    1: 2013-01-01 NA 
    2: 2013-01-02 1 
    3: 2013-01-03 1 
    4: 2013-01-04 1 
    5: 2013-01-05 NA 
---    
177: 2013-06-26 26 
178: 2013-06-27 26 
179: 2013-06-28 26 
180: 2013-06-29 NA 
181: 2013-06-30 NA 

EDIT: J'utilise le frais data.table version 1.8.11, Note: détails de la session

sessionInfo() 

R version 3.0.0 (2013-04-03) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] data.table_1.8.11 

loaded via a namespace (and not attached): 
[1] plyr_1.8  reshape2_1.2.2 stringr_0.6.2 tools_3.0.0 

Merci

Répondre

4

Il n'y a rien à rouler après la première jointure, chaque ligne de dt2a une ligne correspondante dans dt1[dt2, roll = .]. Il suffit donc de faire les deux rouleaux séparément et de les combiner ensemble, par exemple:

dt1[dt2, roll = 1][, ind := ifelse(is.na(ind), dt1[dt2, roll = -1]$ind, ind)] 
+0

merci! Pour une certaine raison [PEBKAC] (http://en.wikipedia.org/wiki/User_error), j'avais l'impression que la deuxième jointure 'roll' devrait fonctionner sur les valeurs' NA', alors qu'en fait cela fonctionne sur 'NULL 'valeurs –

Questions connexes