說我有一個包含幾個條目像這樣的文件:R:從有序二元組創建全長時間序列有時間戳
02/10/11 10:26:35 AM UTC, 0
02/10/11 10:26:38 AM UTC, 1
02/10/11 10:26:42 AM UTC, 0
有沒有什麼簡單的方法,在R
,把這個信息轉換爲全長二進制時間序列(假設採樣間隔爲一秒),用零和一個值來表示?
在這個例子中系列將是:
編輯:由於德克和Josh了獨特的解決方案,我想看看他們在處理時間方面如何比較:
library(xts)
library(data.table)
library(rbenchmark)
doseq <- function(N,Nby){
base.t <<- Sys.time()
t.seq <<- base.t + seq.int(from=0, to=N, by=Nby)
n.t <<- length(t.seq)
val.seq <<- (1:n.t - 1) %% 2
}
josh <- function(N,Nby=10){
doseq(N,Nby)
dt1 <- data.table(time = t.seq, val=val.seq, key="time")
dt2 <- data.table(time = with(dt1, seq(min(time), max(time), by=1)), key = "time")
dtf <- dt1[dt2, rolltolast = TRUE]
return(dtf)
}
dirk <- function(N,Nby=10){
doseq(N,Nby)
xt1 <- xts(val.seq, t.seq)
secs <- seq(start(xt1), end(xt1), by="1 sec")
xtf <- zoo::na.locf(merge(xt1, xts(, secs)))
return(xtf)
}
bm <- benchmark(josh(1e2,10), josh(1e3,10), josh(1e4,10), josh(1e5,10), josh(1e6,10),
dirk(1e2,10), dirk(1e3,10), dirk(1e4,10), dirk(1e5,10), dirk(1e6,10),
columns=c("test", "replications","elapsed", "relative"),
replications=10)
print(bm)
捐贈:
test replications elapsed relative
6 dirk(100, 10) 10 0.024 1.000
7 dirk(1000, 10) 10 0.026 1.083
8 dirk(10000, 10) 10 0.044 1.833
9 dirk(1e+05, 10) 10 0.321 13.375
10 dirk(1e+06, 10) 10 3.342 139.250
1 josh(100, 10) 10 0.034 1.417
2 josh(1000, 10) 10 0.036 1.500
3 josh(10000, 10) 10 0.070 2.917
4 josh(1e+05, 10) 10 0.453 18.875
5 josh(1e+06, 10) 10 5.381 224.208
如此看來,他們都沒有太大的不同,但xts
方法是somewh快於data.table
方法。
是。你能否在你的問題中加上「爲什麼」的答案?我猜你正在努力達到什麼樣的效果,因爲最終結果會比你想要的更好。 – John
爲什麼?因爲我會與其他人分享這些數據,所以我想消除數字代表的含糊之處。 –
0.334s vs 0.538s似乎是平均時間的微小差異。你確定這個結論是穩健的嗎?它包括在每個複製中一次又一次地創建數據的時間。在計算方法時,我看到的時間要短得多。 -1,現在總是可以稍後反轉。 –