我希望这是一个直截了当的问题。我有一个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
索引,同时省略NA
值。让我们说比较我们从对象中索引为4的时间2007-05-04 10:20:50.871
开始。因此,这意味着紧接在此时间之前的市场价格为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
对象的索引中的时间不同,第二个条件检查以确保没有{{1} } NA
列中的值。
然而,当我看几天时,我现在遇到了一个问题。让我们说我现在有一个MarketPrice
对象如下:
xts
如果我从索引3开始(即在 | 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
值不会NA
1}}列,它将转到索引1,即MarketPrice
。然而问题是,这是在不同的一天,我想确保我只在同一天提取2007-05-03 16:59:58.921
值的索引。
基本上,我想知道我是否可以在IF语句中对我的MarketPrice
进行快速修改,这样我就可以避免从前一天找到MarketPrice的索引。另外,我不希望白天分割MPFunction
对象,因为如果我这样做会使事情变得复杂。
现在,我已经有了一些关于如何解决此问题的想法(例如使用xts
函数来检查日期等)但这些都是耗时的方法,所以我希望找到一种方法要快得多,所以如果有人有任何想法,我会很感激。提前谢谢。
答案 0 :(得分: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
)< / p>