2017-10-21 110 views
0

我很努力地找到一種很好的方式,將月中發生的最後一個值發送到我的xts對象的月末。R LOCF直到月份在xts對象結尾

2010-02-26  4029.027 
2010-02-27  4029.027 
2010-02-28  4029.027 
2010-03-04  4029.027 
2010-03-05  4029.027 
2010-03-20  4029.027 
2010-03-26  4029.027 
2010-03-27  4029.027 
2010-03-28  4029.027 
2010-03-31  4029.027 
2010-04-02  4029.027 
2010-04-03  5956.582 
2010-04-04   NA 
2010-04-11   NA 
2010-04-24   NA 
2010-04-25   NA 
2010-04-28   NA 
2010-04-30   NA 
2010-05-01   NA 

你可以從我的數據見上我有「NA的」 2010-04的後,理想我想攜帶5956.582向前,直到月底,所以我的數據會看起來像:

2010-02-26  4029.027 
2010-02-27  4029.027 
2010-02-28  4029.027 
2010-03-04  4029.027 
2010-03-05  4029.027 
2010-03-20  4029.027 
2010-03-26  4029.027 
2010-03-27  4029.027 
2010-03-28  4029.027 
2010-03-31  4029.027 
2010-04-02  4029.027 
2010-04-03  5956.582 
2010-04-04  5956.582 
2010-04-11  5956.582 
2010-04-24  5956.582 
2010-04-25  5956.582 
2010-04-28  5956.582 
2010-04-30  5956.582 
2010-05-01   NA 

在我開始編寫自己的函數來做這件事之前,我想知道是否有人知道另一種方式?

感謝

ST

回答

2

使用aveas.yearmonna.locf0從動物園包(其中XTS負荷)。這不會使用任何額外的軟件包,而不是您已經使用的xts/zoo。

library(xts) 
ave(x, as.yearmon(time(x)), FUN = na.locf0) 

,並提供:

   [,1] 
2010-02-26 4029.027 
2010-02-27 4029.027 
2010-02-28 4029.027 
2010-03-04 4029.027 
2010-03-05 4029.027 
2010-03-20 4029.027 
2010-03-26 4029.027 
2010-03-27 4029.027 
2010-03-28 4029.027 
2010-03-31 4029.027 
2010-04-02 4029.027 
2010-04-03 5956.582 
2010-04-04 5956.582 
2010-04-11 5956.582 
2010-04-24 5956.582 
2010-04-25 5956.582 
2010-04-28 5956.582 
2010-04-30 5956.582 
2010-05-01  NA 

注:

輸入x在重現的形式是:

Lines <- " 
2010-02-26  4029.027 
2010-02-27  4029.027 
2010-02-28  4029.027 
2010-03-04  4029.027 
2010-03-05  4029.027 
2010-03-20  4029.027 
2010-03-26  4029.027 
2010-03-27  4029.027 
2010-03-28  4029.027 
2010-03-31  4029.027 
2010-04-02  4029.027 
2010-04-03  5956.582 
2010-04-04   NA 
2010-04-11   NA 
2010-04-24   NA 
2010-04-25   NA 
2010-04-28   NA 
2010-04-30   NA 
2010-05-01   NA" 

library(xts) 

z <- read.zoo(text = Lines) 
x <- as.xts(z) 
+0

這個工作一種享受,是一個更容易理解。非常感謝。 – SyTrade

+0

這將如何應用於具有多列的xts對象?我試過「申請」,它抱怨? – SyTrade

+0

'xx < - cbind(a = x,b = x); xx [] < - apply(xx,2,function(x)ave(x,as.yearmon(time(xx)),FUN = na.locf0))' –

0

試試這個,它使用zoo::na.locf填寫NA

你的數據

df <- read.table(text="2010-02-26  4029.027 
2010-02-27  4029.027 
2010-02-28  4029.027 
2010-03-04  4029.027 
2010-03-05  4029.027 
2010-03-20  4029.027 
2010-03-26  4029.027 
2010-03-27  4029.027 
2010-03-28  4029.027 
2010-03-31  4029.027 
2010-04-02  4029.027 
2010-04-03  5956.582 
2010-04-04   NA 
2010-04-11   NA 
2010-04-24   NA 
2010-04-25   NA 
2010-04-28   NA 
2010-04-30   NA 
2010-05-01   NA", header=FALSE) 

解決方案

library(dplyr) 
library(zoo) 
library(lubridate) 

您的May數據是一個問題,因爲它是該月的一個單獨的NA觀察值。這是我有理由使用if (!is.na(.x$V2))到狀態下運行mutate(V2 = na.locf(V2))

result <- df %>% 
      mutate(V1 = ymd(V1)) %>%  # convert to Date just in case 
      split(month(.$V1)) %>%   # split data by month 
      map(., ~if (!is.na(.x$V2)) {.x %>% mutate(V2 = na.locf(V2))} else {.x}) # iterate through list by month 
ans <- Reduce("rbind", result) 

      # V1  V2 
# 1 2010-02-26 4029.027 
# 2 2010-02-27 4029.027 
# 3 2010-02-28 4029.027 
# 4 2010-03-04 4029.027 
# 5 2010-03-05 4029.027 
# 6 2010-03-20 4029.027 
# 7 2010-03-26 4029.027 
# 8 2010-03-27 4029.027 
# 9 2010-03-28 4029.027 
# 10 2010-03-31 4029.027 
# 11 2010-04-02 4029.027 
# 12 2010-04-03 5956.582 
# 13 2010-04-04 5956.582 
# 14 2010-04-11 5956.582 
# 15 2010-04-24 5956.582 
# 16 2010-04-25 5956.582 
# 17 2010-04-28 5956.582 
# 18 2010-04-30 5956.582 
# 19 2010-05-01  NA