2017-10-15 6 views
0

私はうまくいけば簡単な質問があります。私は、次のと少し似xtsオブジェクトがあります。RTSで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  | 

を基本的に、私はまた、NA値をommittingながら、時間の直前にMarketPriceインデックスを見つけるしたいと思います。たとえば、オブジェクト内にインデックスが4の2007-05-04 10:20:50.871から始まるとします。つまり、この時点直前の市場価格は、オブジェクトに2のインデックスを持つ5.31です。このタスクを実行するために、私は次のような機能まで書かれています:

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) 
    } 
} 
} 

をそして、これはxtsオブジェクトのインデックスで時間を確認するためにIF文をチェックにおける最初の条件以来のタスクを実行します第2の条件がMarketPrice列にNA値が存在しないことを確認する。

しかし、数日後に問題が発生しました。私はNAを持っていないこの時間より前に最初のインデックスを検索したい場合は、その後

      | 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  | 
    ---------------------------------------- 

私は(時間2007-05-04 10:20:50.871でIE)インデックス3で起動した場合:さんは次のように私は今xtsオブジェクトを持っているとしましょうMarketPrice列の値は、インデックス1(2007-05-03 16:59:58.921)になります。しかし、これは別の日に行われている問題で、同じ日にMarketPrice値のインデックスのみを抽出するようにしたいのです。

基本的には、前の日のMarketPriceのインデックスを見つけることを避けるIF文で上記の私のMPFunctionにできる簡単な変更があるかどうかは疑問でした。また、私が行った場合、かなり複雑になるので、xtsオブジェクトを1日に分割することは望ましくありません。

これを解決する方法(たとえば、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 

1日に、time_windowの値がない場合、その日はNULLとなり、その日の出力には何も返されません(rr

関連する問題