2011-11-25 61 views
3

我正在通過R中的一些示例代碼獲取動物園對象(時間序列)中每秒的最後數據。我得到的代碼工作,但我不明白以下行:在R時間中查找第二個間隔

time(tmp) <- as.integer(time(tmp) + 1e-7) + Epoch 

爲什麼我們添加1e-7的時間值?在此粘貼完整的代碼。請幫助

library(zoo) 
zsec <- structure(1:10, index = structure(c(1234760403.968, 1234760403.969, 
      1234760403.969, 1234760405.029, 1234760405.029, 1234760405.03, 
      1234760405.03, 1234760405.072, 1234760405.073, 1234760405.073 
      ), class = c("POSIXt", "POSIXct"), tzone = ""), class = "zoo") 

# tmp is zsec with time discretized into one second bins 
tmp <- zsec 
st <- start(tmp) 
Epoch <- st - as.numeric(st) 
time(tmp) <- as.integer(time(tmp) + 1e-7) + Epoch 

# find index of last value in each one second interval 
ix <- !duplicated(time(tmp), fromLast = TRUE) 
+1

這是一個非常好的示例,您應該在代碼中註釋以解釋事情。 「我們添加了1e-7來解決這個奇怪的錯誤。」 –

回答

1

它似乎沒有做任何事情。如果我刪除了+ 1e-7項,R告訴我得到的結構相同

我認爲這是一個舍入項,用於糾正某種可能發生的舍入誤差。

library(zoo) 
    zsec <- structure(1:10, index = structure(c(1234760403.968, 1234760403.969,    
               1234760403.969, 1234760405.029, 1234760405.029, 1234760405.03,    
               1234760405.03, 1234760405.072, 1234760405.073, 1234760405.073    
              ), class = c("POSIXt", "POSIXct"), tzone = ""), class = "zoo") 

    # tmp is zsec with time discretized into one second bins 
    tmp <- zsec 
    st <- start(tmp) 
    Epoch <- st - as.numeric(st) 
    time(tmp) <- as.integer(time(tmp) + 1e-7) + Epoch 

    # find index of last value in each one second interval 
    ix <- !duplicated(time(tmp), fromLast = TRUE) 
    time(tmp)[ix] 

    tmp2 <- zsec 
    st <- start(tmp2) 
    Epoch <- st - as.numeric(st) 
    time(tmp2) <- as.integer(time(tmp2)) + Epoch 


    iy <- identical(time(tmp), time(tmp2)) 

IY < - 相同(時間(TMP),時間(TMP2))

IY

[1] TRUE

相同((as.integer(時間(TMP) + 9.99999E-1)),as.integer(時間(TMP2)))

[1] TRUE

相同((as.integ ER(時間(TMP)+ 9.999999e-1)),as.integer(時間(TMP 2)))

[1] FALSE

+0

太好了。即使我認爲如此......只是似乎將> x.9991轉換爲時間x + 1秒。非常感謝 – Ramya

0

狂亂猜測,但對於添加少量的東西的最常見原因是爲了避免零分問題。也許作者想要

time(tmp) - time(zsec) 

給出非零範圍。 (雖然請注意,time似乎在丟棄差異,因爲它們非常小,這就是爲什麼identical(zsec, tmp)返回TRUE。)