2017-10-15 49 views
0

我有希望的直接問題。我有一個xts對象有點類似以下內容:使用R中的XTS在同一天執行操作

     | MarketPrice | 
---------------------------------------- 
2007-05-04 10:15:33.546 | 5.32  | 
---------------------------------------- 
2007-05-04 10:16:42.100 | 5.31  | 
---------------------------------------- 
2007-05-04 10:17:27.546 | NA   | 
---------------------------------------- 
2007-05-04 10:20:50.871 | 5.35  | 
---------------------------------------- 
2007-05-04 10:21:38.652 | 5.37  | 

基本上,我想馬上一時間之前找到MarketPrice指數,同時ommitting NA值。比方說,我們從2007-05-04 10:20:50.871開始,在對象中索引爲4。因此,這意味着緊接此時間之前的市場價格是5.31,其對象中的指數爲2。爲了完成這個任務,我已經寫了類似如下的功能:

MPFunction <- function(t,df){ 

ind <- t 
while(t>1){ 
    t=t-1 
    if ((index(df[t]) != index(df[ind])) && !(is.na(df[t,"MarketPrice"]))) { 

    return(t) 
    } 
} 
} 

而這個執行,因爲在IF語句檢查的首要條件,以確保在xts對象的索引時代任務是不同的,第二個條件檢查以確保MarketPrice列中沒有NA值。

但是,我現在遇到了一個問題,當我看了幾天。比方說,我現在有一個xts對象如下:

      | MarketPrice | 
    ---------------------------------------- 
    2007-05-03 16:59:58.921 | 5.32  | 
    ---------------------------------------- 
    2007-05-04 10:12:27.546 | NA   | 
    ---------------------------------------- 
    2007-05-04 10:20:50.871 | 5.35  | 
    ---------------------------------------- 

如果我在指數3(即當時2007-05-04 10:20:50.871)開始,然後,如果我希望能夠找到在此時間之前不會有NA第一個索引值在MarketPrice列中,它將轉到索引1,即2007-05-03 16:59:58.921。但問題是這是在不同的一天,我想確保我只在同一天提取MarketPrice值的索引。

基本上,我想知道在IF聲明中是否可以對我的MPFunction進行快速修改,這將允許我避免在前一天找到MarketPrice的指數。另外,我不希望白天將對象拆分,因爲如果我這樣做會使事情變得複雜。如何解決這個問題(例如使用strptime函數來檢查日期等),但這些都是耗時的方法,所以我希望找到一種方法,這個方法是非常多的更快,所以如果有人有任何想法,我會很感激。提前致謝。

回答

1

聽起來像是你真的想使用split.xts,和重組的結果(爲什麼使用拆分併發症它不應該是,即使有大量的每一天剔數據?):

zz=xts(order.by = as.POSIXct(c("2007-05-03 09:59:58.921", 
           "2007-05-03 10:03:58.921", 
           "2007-05-03 12:03:58.921" 
        "2007-05-04 10:15:33.546", 
       "2007-05-04 10:16:42.100", 
       "2007-05-04 10:17:27.546", 
       "2007-05-04 10:20:50.871", 
       "2007-05-04 10:21:38.652")), 
    x = c(3, 4, 9, 5.32, 5.31, NA, 5.35, 5.37), dimnames = list(NULL, "MarketPrice")) 

> zz 
#      MarketPrice 
# 2007-05-03 09:59:58  3.00 
# 2007-05-03 10:03:58  4.00 
# 2007-05-04 10:15:33  5.32 
# 2007-05-04 10:16:42  5.31 
# 2007-05-04 10:17:27   NA 
# 2007-05-04 10:20:50  5.35 
# 2007-05-04 10:21:38  5.37 


MPFunction <- function(x, time_window = "T10/T10:16:40") { 
    #last(x[time_window, which.i= TRUE]) # get the index? 
    # last returns the last row in the group selected: 
    #last(x[time_window,]) 
    u <- x[time_window, which.i = TRUE] 

    if (length(u) > 0) { 
    # Get index which is not an NA value: 
    u.na <- which(is.na(x[time_window, "MarketPrice"])) 
    u2 <- u[!u %in% u.na] 
    if (length(u2) > 0) { 
     v <- xts(order.by = end(x[last(u2)]), x = last(u2), dimnames = list(NULL, "index.i"))   
    } else { 
     v <- NULL  
    } 
    } else { 
    v <- NULL 
    } 
    v 
} 

# use T0/ as the start of the time window in each day for getting the index value by default. You can change this though. 
chosen_window = "T0/T10:17:29" 

by_day <- lapply(split(zz, f = "day"), FUN = MPFunction, time_window = chosen_window) 

rr <- do.call(rbind, by_day) 

> rr 
#      index.i 
# 2007-05-03 10:03:58  2 
# 2007-05-04 10:16:42  2 

如果在感興趣的time_window中一天中沒有值,那麼當天將獲得NULL,並且當天的輸出中沒有返回(rr