2013-04-08 6 views
15

data.table ist genial, weil ich Rolling Joins machen kann, und sogar Rolling Joins in Gruppen!Rolling Joins: vorwärts und rückwärts rollen

library(data.table) 
set.seed(42) 
metrics <- data.frame(
    ID=c(rep(1, 10), rep(2,5), rep(3,5)), 
    Time=c(1:10, 4:8, 8:12), 
    val1=runif(20), 
    val2=runif(20), 
    val3=runif(20), 
    val4=runif(20) 
) 
metrics <- data.table(metrics[sample(1:nrow(metrics), 15),], key=c('ID', 'Time')) 
calendar <- data.table(expand.grid(ID=1:3, Time=1:12), key=c('ID', 'Time')) 

metrics[calendar,roll=TRUE] 

Allerdings ist das nicht genial genug für mich. Diese data.table hat noch NAs:

> metrics[calendar,roll=TRUE] 
    ID Time  val1  val2  val3  val4 
1: 1 1 0.9148060 0.9040314 0.3795592 0.675607275 
2: 1 2 0.9370754 0.1387102 0.4357716 0.982817198 
3: 1 3 0.9370754 0.1387102 0.4357716 0.982817198 
4: 1 4 0.8304476 0.9466682 0.9735399 0.566488424 
5: 1 5 0.8304476 0.9466682 0.9735399 0.566488424 
6: 1 6 0.5190959 0.5142118 0.9575766 0.189473935 
7: 1 7 0.7365883 0.3902035 0.8877549 0.271286615 
8: 1 8 0.7365883 0.3902035 0.8877549 0.271286615 
9: 1 9 0.6569923 0.4469696 0.9709666 0.693204820 
10: 1 10 0.7050648 0.8360043 0.6188382 0.240544740 
11: 1 11 0.7050648 0.8360043 0.6188382 0.240544740 
12: 1 12 0.7050648 0.8360043 0.6188382 0.240544740 
13: 2 1  NA  NA  NA   NA 
14: 2 2  NA  NA  NA   NA 
15: 2 3  NA  NA  NA   NA 
16: 2 4 0.4577418 0.7375956 0.3334272 0.042988796 
17: 2 5 0.7191123 0.8110551 0.3467482 0.140479094 
18: 2 6 0.9346722 0.3881083 0.3984854 0.216385415 
19: 2 7 0.2554288 0.6851697 0.7846928 0.479398564 
20: 2 8 0.2554288 0.6851697 0.7846928 0.479398564 
21: 2 9 0.2554288 0.6851697 0.7846928 0.479398564 
22: 2 10 0.2554288 0.6851697 0.7846928 0.479398564 
23: 2 11 0.2554288 0.6851697 0.7846928 0.479398564 
24: 2 12 0.2554288 0.6851697 0.7846928 0.479398564 
25: 3 1  NA  NA  NA   NA 
26: 3 2  NA  NA  NA   NA 
27: 3 3  NA  NA  NA   NA 
28: 3 4  NA  NA  NA   NA 
29: 3 5  NA  NA  NA   NA 
30: 3 6  NA  NA  NA   NA 
31: 3 7  NA  NA  NA   NA 
32: 3 8 0.9400145 0.8329161 0.7487954 0.719355838 
33: 3 9 0.9400145 0.8329161 0.7487954 0.719355838 
34: 3 10 0.1174874 0.2076590 0.1712643 0.375489965 
35: 3 11 0.4749971 0.9066014 0.2610880 0.514407708 
36: 3 12 0.5603327 0.6117786 0.5144129 0.001570554 
    ID Time  val1  val2  val3  val4 

Ich konnte diese NA füllen mit zoo:::na.locf, fromLast=TRUE, aber das ist nicht sehr lustig. Kann jemand an eine elegante Art und Weise denken, wie ich NA's rückwärts rollen kann, (nach dem Rollen sie nach vorne), während der data.table Beitritt?

Antwort

20

Dies ist möglich, in data.table Version 1.8.8 freigegeben März 2013:

metrics[calendar, roll=TRUE, rollends=c(TRUE, TRUE)] 

Vom data.table NEWS file:

Neben WAHR/FALSCH, 'Roll' kann jetzt sei eine positive Zahl (vorwärts rollen/LOCF) oder negative Zahl (rückwärts rollen/NOCB). Eine endliche Zahl begrenzt den Abstand, um den ein Wert gerollt wird (begrenzte Stalenheit). roll = TRUE und roll = + Inf sind gleichwertig. 'Rollends' ist ein neuer Parameter, der zwei logische Elemente enthält. Die erste Beobachtung wird zurückgesetzt, wenn der erste Wert von Rollends TRUE ist. Die letzte Beobachtung wird vorwärts gerollt, wenn der zweite Wert von rollends TRUE ist. Wenn roll eine endliche Zahl ist, gilt das gleiche Limit für die Enden. Neuer Wert roll = 'nearest' verbindet sich mit dem nächsten Wert (entweder rückwärts oder vorwärts), wenn der Wert in eine Lücke fällt, und auf den Endwert gemäß 'rollends'. "Rolltoleranz" ist veraltet. Zur Abwärtskompatibilität wird es in {roll = TRUE; rollends = c (FALSE, FALSE)} konvertiert.

Wie immer, die meisten up-to-date-Version von data.table zum Download finden Sie Installation.

+0

erstaunlich! Hahaha, das ist großartig. – Zach

+0

+1 Ich habe gerade etwas tolles gelernt! Danke –

+0

Ich kann das nicht verstehen "Die erste Beobachtung wird zurückgerollt, wenn rollends1 TRUE ist". Bedeutet das, dass es sich auf Werte LESS THAN bezieht, wenn roll = + Inf – eamo

7

metrics[calendar, roll = TRUE, rollends = c(TRUE, TRUE)]

Verwandte Themen