2013-09-21 50 views
3

想象我有POSIXct對象的輸入向量:遍歷POSIXlt中的R

times.input <- c(
    as.POSIXct('2013-01-01 00:00:00', tz='GMT'), 
    as.POSIXct('2013-01-01 00:00:01', tz='GMT') 
) 
class(times.input) 
# [1] "POSIXct" "POSIXt" 

某些功能(如roundtrunc)變換POSIXctPOSIXlt

unique.dates <- unique(trunc(times.input, 'days'))) 
class(times.rounded) 
# [1] "POSIXlt" "POSIXt" 

然後,如果我們嘗試迭代或lapply這個對象,發生奇怪的事情:

lapply(X=unique.dates, FUN=print) 
# [1] 0 0 
# [1] 0 0 
# [1] 4 4 
# [1] 1 1 
# [1] 0 0 
# [1] 113 113 
# [1] 2 2 
# [1] 0 0 
# [1] 0 0 

看起來好像POSIXlt作爲矢量列表在內部垂直存儲, 並且迭代遍歷內部結構而不是遍歷每個對象。

我知道轉換爲POSIXct有助於在這種情況下,因爲POSIXct是作爲一個整數內部存儲的,但我認爲這個解決方案是醜陋的。

所以我的問題是:給定一個POSIXlt[2]數據輸入,如何執行循環或lapply超過POSIXct對象?

+1

你能說清楚,你究竟想要做什麼? 'print(times.round)'適合你的例子。否則,通用建議轉換爲'POSIXct',這可能是最不「醜陋」的解決方案。 – Roland

+1

爲什麼難以脅迫POSIXct?我不明白你的最後一個問題,因爲POSIXlt ... hos能循環什麼? – agstudy

+0

我用'print'代替了複雜的函數來表示問題。在現實世界中,使用了一些像'downloadDataForDate'這樣的函數。 –

回答

2

它的發生原因lapply作品的名單,你是正確的存儲,之後help("DateTimeClasses")

類 「POSIXlt」 爲載體的命名列表(...)

如果你真的需要與POSIXlt工作,我建議轉換爲列表,例如:

times.input.L <- split(times.input, seq_along(times.input)) 
lapply(times.input.L, print) 
[1] "2013-01-01 01:00:00 CET" 
[1] "2013-01-01 01:00:01 CET"