R時間における第2の間隔の発見

私は動物園のオブジェクト(時系列)の各秒の最後のデータを取得する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)
3
これは、物事を説明するためにコードにコメントを書くべき場所の本当に良い例です。 「この奇妙なバグを解決するために、1e-7を追加しました。」
追加された 著者 Richie Cotton,

2 答え

それは何もしていないようです。 + 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 


   私は <- identical(time(tmp), time(tmp2))

私は <- identical(time(tmp), time(tmp2))

私は

[1]真

((時間(tmp)+ 9.99999e-1))、as.integer(時間(tmp2)))

[1]真

(時間(tmp)+ 9.999999e-1))、as.integer(時間(tmp2)))

[1]偽

1
追加された
すばらしいです 。でも、私はそう思っています。> x.9991で何かを時間x + 1秒に変換するようです。どうもありがとう
追加された 著者 Ramya,

ひどく推測されますが、小さな量を何かに追加する最も一般的な理由は、ゼロ問題による除算を避けることです。おそらく著者が欲しかった

time(tmp) - time(zsec)

非ゼロの範囲を与える。 ( same(zsec、tmp)がTRUEを返す理由は、 time はその差を破棄しているように見えるが、

0
追加された