2010-08-07 30 views
1

我有大多NA项载体。我想用该矢量的前面的非NA条目替换每个NA。具体而言,第一项永远是1,后面一堆NA S,我想1. i个条目,以取代可能是另一个数字,比方说2,其次是更NA s表示我想更换与2.等等。下面的循环实现了这一点,但必须有一个更R的方式来做到这一点,对吧?我想与ifelse()向量化,但我无法弄清楚如何更换与i-1个条目i个条目。避免循环,当进入我可能会进入i的值-1

> vec <- rep(NA, 10) 
> vec 
[1] NA NA NA NA NA NA NA NA NA NA 
> vec[1] <- 1; vec[4] <- 2; vec[7] <- 3 
> vec 
[1] 1 NA NA 2 NA NA 3 NA NA NA 
> for (i in 1:length(vec)) if (is.na(vec[i])) vec[i] <- vec[i-1] 
> vec 
[1] 1 1 1 2 2 2 3 3 3 3 

谢谢!

如果上下文帮助,我调整了股票分割从WRDS数据库,其中有一栏,显示的时候和分裂是如何发生的。

回答

5

这包zoo已经实现,功能na.locf(最后一次观察结转)。另请参阅:Propagating data within a vector

+0

谢谢! (一半的答案已经在这里......我只需要搜索正确的短语) – 2010-08-07 12:25:57

1

如果您正在调整股票拆分,也许可以使用TTR包中的adjRatios。在C中完成所有繁重的工作,所以速度非常快。有关如何使用adjRatios来调整数据的示例,请参阅adjustOHLC

> require(quantmod) 
> getSymbols("IBM",from="1980-01-01") 
[1] "IBM" 
> spl <- getSplits("IBM",from="1980-01-01") 
> div <- getDividends("IBM",from="1980-01-01") 
> 
> head(spl) 
      IBM.spl 
1997-05-28  0.5 
1999-05-27  0.5 
> head(div) 
      [,1] 
1980-02-06 0.215 
1980-05-08 0.215 
1980-08-07 0.215 
1980-11-05 0.215 
1981-02-05 0.215 
1981-05-07 0.215 
> 
> adjusters <- adjRatios(spl, div, Cl(IBM)) 
> head(adjusters) 
      Split  Div 
1980-01-02 0.25 0.7510967 
1980-01-03 0.25 0.7510967 
1980-01-04 0.25 0.7510967 
1980-01-07 0.25 0.7510967 
1980-01-08 0.25 0.7510967 
1980-01-09 0.25 0.7510967