2011-12-09 44 views
3

我有一個相當奇怪的問題,可能最好通過R會話的示例進行描述。正如下面的評論所要求的那樣,我試圖使其具有可重複性。從「動物園」到「xts」的轉換會在索引中創建大量的NA

meto <- structure(c(30, 25, 25, 25, 20, 20, 20, 20, 20, 20), index = structure(c(12796, 
      12796.0416666667, 12796.0833333333, 12796.125, 12796.1666666667, 
      12796.2083333333, 12796.25, 12796.2916666667, 12796.3333333333, 
      12796.375), format = structure(c("d/m/y", "h:m:s"), .Names = c("dates", 
      "times")), origin = structure(c(1, 1, 1970), .Names = c("month", 
      "day", "year")), class = c("chron", "dates", "times")), class = "zoo") 

的示例數據集的樣子:

> meto 
(13/01/05 00:00:00) (13/01/05 01:00:00) (13/01/05 02:00:00) (13/01/05 03:00:00) (13/01/05 04:00:00) 
       30     25     25     25     20 
(13/01/05 05:00:00) (13/01/05 06:00:00) (13/01/05 07:00:00) (13/01/05 08:00:00) (13/01/05 09:00:00) 
       20     20     20     20     20 
> str(meto) 
‘zoo’ series from (13/01/05 00:00:00) to (13/01/05 09:00:00) 
    Data: num [1:10] 30 25 25 25 20 20 20 20 20 20 
    Index: Classes 'chron', 'dates', 'times' atomic [1:10] 12796 12796 12796 12796 12796 ... 
    ..- attr(*, "format")= Named chr [1:2] "d/m/y" "h:m:s" 
    .. ..- attr(*, "names")= chr [1:2] "dates" "times" 
    ..- attr(*, "origin")= Named num [1:3] 1 1 1970 
    .. ..- attr(*, "names")= chr [1:3] "month" "day" "year" 

當我們轉換爲XTS:

m <- as.xts(meto) 

這導致了以下的輸出:

> str(m) 
An ‘xts’ object from NA to NA containing: 
    Data: num [1:10, 1] 30 25 25 25 20 20 20 20 20 20 
    Indexed by objects of class: [chron,dates,times] TZ: 
    xts Attributes: 
NULL 
> summary(m) 
    Index   m  
Min. :NA Min. :20.0 
1st Qu.:NA 1st Qu.:20.0 
Median :NA Median :20.0 
Mean :NA Mean :22.5 
3rd Qu.:NA 3rd Qu.:25.0 
Max. :NA Max. :30.0 
NA's :10     
Warning message: 
In data.row.names(row.names, rowsi, i) : 
    some row.names duplicated: 2,3,4,5,6,7,8,9,10 --> row.names NOT used 

,你可以看,動物園時間系列h作爲其中的大量數據,通過chron對象進行索引。但是,當我使用as.xts將其轉換爲xts時間序列時,看起來確定以......開頭,但str命令顯示了NAs,並將meto的摘要與m進行比較,表明已在索引中創建了36,000多個NA!

有沒有人知道爲什麼會發生這種情況,或者我可以做些什麼來解決它?

+0

沒有實際的數據集,很難提供答案。嘗試創建一個可重現此問題的模型數據集。您可以添加幾行代碼在您的文章中創建模型數據集,以便我們可以運行代碼。另外,想出一個可重複的例子有時已經解決了這個問題:)。 –

+0

謝謝保羅。有沒有一種方法可以輕鬆地將部分數據集轉儲爲可以輕鬆從命令行讀回的字符串?我可以考慮提供數據(手動創建數據除外)的唯一方法是提供CSV文件以供下載。 – robintw

+2

@robintw你可以使用dput – LouisChiffre

回答

4

問題是您的索引是chron類。我對chron知之甚少,但AFAIK通常優選在R中使用POSIX日期時間對象,即POSIXctPOSIXlt

在從zooxts轉換的某處,chron類信息被破壞。

將您的索引轉換爲類POSIXct可解決此問題。

index(meto) <- as.POSIXct(index(meto)) 
as.xts(meto) 

        [,1] 
2005-01-13 00:00:00 30 
2005-01-13 01:00:00 25 
2005-01-13 01:59:59 25 
2005-01-13 03:00:00 25 
2005-01-13 04:00:00 20 
2005-01-13 04:59:59 20 
2005-01-13 06:00:00 20 
2005-01-13 07:00:00 20 
2005-01-13 07:59:59 20 
2005-01-13 09:00:00 20 

有關有R日期和時間類的更多信息,請參閱?DateTimeClasses?POSIXct?strptime - 這一切都導致了同樣的幫助頁面。


編輯

如果xts應該處理來自zoo導入時chron對象,你可能已經發現了一個bug在功能xts::xts

出現該問題的在這條線:

if (inherits(order.by, "dates")) 
    index <- as.numeric(as.POSIXct(strptime(as.character(order.by), 
     "(%m/%d/%y %H:%M:%S)"))) 

但是請注意,您chron對象的格式爲("d/m/y", "h:m:s") - 我知道這從str(meto)。仔細觀察 - 日間和月份之間存在錯位。

這可能是一個語言環境問題。我相信包裹作者居住在美國,標準格式是m/d/y,但在許多其他地方,標準格式是d/m/y。

因此,不管怎樣,在動物園和xts之間的轉換中,轉換代碼應該針對用戶的區域設置進行調整。

我建議您聯繫軟件包作者並提供此信息。

+0

)通常我使用POSIXct來處理日期時間,Chron對我來說也有點神祕,我聽說lubridate是相當不錯的 – LouisChiffre

+0

感謝Andrie--現在解決了這個問題,但是我仍然對爲什麼'chron'索引似乎不起作用感興趣--XTS文檔表明它們(並且我有其他XTS對象與chron索引工作正常) – robintw

+0

Lubridate是有用的,並給你一些非常方便的POSIXct包裝。 – Andrie