2015-08-18 55 views
1

我想要聯接兩個data.table的。這裏有一個例子:data.table卷聯接不能正常工作

library(data.table) 

tmp1 <- data.table(structure(list(Code = c("AED", "AED", "AED", "AED", "AED"), 
            Date = structure(c(97286400, 97372800, 97459200, 97545600, 97632000), 
                class = c("POSIXct", "POSIXt"), tzone = "UTC")), 
          .Names = c("Code", "Date"), row.names = c(NA, -5L), class = "data.frame")) 

tmp2 <- data.table(structure(list(Date = structure(c(97286400, 99705600, 102297600), tzone = "UTC", 
                class = c("POSIXct", "POSIXt")), 
            Val = c(4.39, 3.96, 3.9474), Code = c("AED", "AED", "AED")), 
          .Names = c("Date", "Val", "Code"), row.names = c(NA, -3L), class = "data.frame")) 

> tmp1 
    Code  Date 
1: AED 1973-01-31 
2: AED 1973-02-01 
3: AED 1973-02-02 
4: AED 1973-02-03 
5: AED 1973-02-04 

> tmp2 
     Date Val Code 
1: 1973-01-31 4.3900 AED 
2: 1973-02-28 3.9600 AED 
3: 1973-03-30 3.9474 AED 

> setkey(tmp1,Code,Date) 

> setkey(tmp2,Code,Date) 

> tmp2[tmp1,roll=TRUE] 
     Date Val Code 
1: 1973-01-31 4.39 AED 
2: 1973-02-01 4.39 AED 
3: 1973-02-02 4.39 AED 
4: 1973-02-03 4.39 AED 
5: 1973-02-04 4.39 AED 

> tmp2[tmp1,roll=2] 
     Date Val Code 
1: 1973-01-31 4.39 AED 
2: 1973-02-01 NA AED 
3: 1973-02-02 NA AED 
4: 1973-02-03 NA AED 
5: 1973-02-04 NA AED 

第一卷工作正常。在第二個例子中,我希望4.39能夠延續到1973-02-02,正如文檔所述:「當roll是一個正數時,這限制了值的傳播距離。」我期望看到:

> tmp2[tmp1,roll=2] 
     Date Val Code 
1: 1973-01-31 4.39 AED 
2: 1973-02-01 4.39 AED 
3: 1973-02-02 4.39 AED 
4: 1973-02-03 NA AED 
5: 1973-02-04 NA AED 

這是一個錯誤還是我誤解了功能?

回答

3

你說得很對。原因是你的日期是POSIXct,所以roll數字是以秒爲單位的,而不是幾天。您的卷設置爲2天,以秒爲:

class(tmp1$Date) 
> class(tmp1$Date) 
[1] "POSIXct" "POSIXt" 
> tmp2[tmp1, roll=2*3600*24] 
     Date Val Code 
1: 1973-01-31 4.39 AED 
2: 1973-02-01 4.39 AED 
3: 1973-02-02 4.39 AED 
4: 1973-02-03 NA AED 
5: 1973-02-04 NA AED 

或強迫你Date通過Date:=as.Date(Date)和使用roll=2,根據自己的喜好。

+0

清除它。我認爲參數指的是行數,比如在zoo :: na.locf中。謝謝! –

+0

啊,沒有。它被添加到您正在滾動的內容中並用作容差。 –