2016-05-12 93 views
2

我有一個多天的XTS對象,而且我試圖創建一個真實的指示符,在一天的其餘時間內保持正確。複製每天的最後一個值

output <- apply.daily(x, na.locf) 

重複性代碼:

y <- as.xts(c(NA,NA,1,NA,NA,NA,NA,NA,NA),as.POSIXct(c(
            "2010-01-05 00:00:00", "2010-01-05 00:04:00", "2010-01-05 00:08:00", 
            "2010-01-05 00:12:00", "2010-01-05 00:16:00", "2010-01-05 00:20:00", 
            "2010-01-06 00:00:00", "2010-01-06 00:04:00", "2010-01-06 00:08:00"))) 

所需的輸出是向下的「1」複製我試圖(但它不工作)的方法與日常應用結合na.locf功能那天剩下的時間。所以:

y <- as.xts(c(NA,NA,1,1,1,1,NA,NA,NA),as.POSIXct(c(
            "2010-01-05 00:00:00", "2010-01-05 00:04:00", "2010-01-05 00:08:00", 
            "2010-01-05 00:12:00", "2010-01-05 00:16:00", "2010-01-05 00:20:00", 
            "2010-01-06 00:00:00", "2010-01-06 00:04:00", "2010-01-06 00:08:00"))) 

回答

2

一種選擇是

y1 <- ave(y, as.Date(index(y)), FUN= function(x) na.locf(x, na.rm=FALSE)) 
y1 
#      [,1] 
#2010-01-05 00:00:00 NA 
#2010-01-05 00:04:00 NA 
#2010-01-05 00:08:00 1 
#2010-01-05 00:12:00 1 
#2010-01-05 00:16:00 1 
#2010-01-05 00:20:00 1 
#2010-01-06 00:00:00 NA 
#2010-01-06 00:04:00 NA 
#2010-01-06 00:08:00 NA 

str(y1) 
# An ‘xts’ object on 2010-01-05/2010-01-06 00:08:00 containing: 
# Data: num [1:9, 1] NA NA 1 1 1 1 NA NA NA 
# Indexed by objects of class: [POSIXct,POSIXt] TZ: 
# Original class: 'double' 
# xts Attributes: 
# NULL 

str(y) 
#An ‘xts’ object on 2010-01-05/2010-01-06 00:08:00 containing: 
# Data: num [1:9, 1] NA NA 1 NA NA NA NA NA NA 
# Indexed by objects of class: [POSIXct,POSIXt] TZ: 
# Original class: 'double' 
# xts Attributes: 
# NULL 
+0

這很好。你是否僅僅使用ave函數來子集?還是有另一個原因? –

+0

@EdWilson'ave'函數用於在每個'日期'上應用'na.locf' – akrun

2

我覺得period.apply通過apply.daily叫不喜歡被na.locf返回的值。沒有很徹底地調查過爲什麼。無論如何,我試圖以圓滿的方式去做它應該做的事情。我可以看到akrun的答案肯定比這更好。只是在這裏留下。

R> y <- as.xts(c(NA,NA,1,NA,NA,NA,NA,NA,NA), 
+    as.POSIXct(c("2010-01-05 00:00:00", "2010-01-05 00:04:00", 
+       "2010-01-05 00:08:00", "2010-01-05 00:12:00", 
+       "2010-01-05 00:16:00", "2010-01-05 00:20:00", 
+       "2010-01-06 00:00:00", "2010-01-06 00:04:00", 
+       "2010-01-06 00:08:00"))) 
R> endpoints(y, "days") 
[1] 0 6 9 
R> ep <- endpoints(y, "days") 
R> diff(ep) 
[1] 6 3 
R> dep <- diff(ep) 
R> rep.int(1:length(dep), times=dep) 
[1] 1 1 1 1 1 1 2 2 2 
R> runs <- rep.int(1:length(dep), times=dep) 
R> lapply(split(y, runs), na.locf, na.rm=FALSE) 
$`1` 

2010-01-05 00:00:00 NA 
2010-01-05 00:04:00 NA 
2010-01-05 00:08:00 1 
2010-01-05 00:12:00 1 
2010-01-05 00:16:00 1 
2010-01-05 00:20:00 1 

$`2` 

2010-01-06 00:00:00 NA 
2010-01-06 00:04:00 NA 
2010-01-06 00:08:00 NA 

R> splits <- lapply(split(y, runs), na.locf, na.rm=FALSE) 
R> do.call('rbind', splits) 

2010-01-05 00:00:00 NA 
2010-01-05 00:04:00 NA 
2010-01-05 00:08:00 1 
2010-01-05 00:12:00 1 
2010-01-05 00:16:00 1 
2010-01-05 00:20:00 1 
2010-01-06 00:00:00 NA 
2010-01-06 00:04:00 NA 
2010-01-06 00:08:00 NA 
R> ynew <- do.call('rbind', splits) 
+0

這種方法是合理的,並且是一種典型的'xts'方法。儘管可以通過使用'do.call(rbind,lapply(split(y,「days」),na.locf))來實現全部結果' – FXQuantTrader