2016-05-12 1 views
2

私は複数日のXTSオブジェクトを持っています。一度真実で残りの日は真実であるというインジケータを作成しようとしています。1日の間に最後の値をコピーします

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

1つのオプションは、私がna.locfによって返された値が好きではありませんapply.dailyによって呼び出さperiod.apply考える

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'関数は各 'Date'に' na.locf'を適用するために使用されます – akrun

2

です。なぜ非常に徹底的に調査していない。とにかく、ラウンドアラウンドのやり方でやりたいことをやろうとしました。 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

関連する問題