2010-08-07 3 views
1

나는 대부분 NA 엔트리를 가진 벡터를 가지고있다. 모든 NA을 해당 벡터의 앞에있는 NA 항목으로 바꿔야합니다. 특히, 첫 번째 항목은 항상 1로 바뀌고 NA은 1로 바뀝니다. i 번째 항목은 다른 숫자 일 수 있습니다. 2라고 말하면서 다음과 같이 바꿉니다. NA 2 등. 아래의 루프가이를 수행하지만 더 많은 R 방법이 필요합니다. 맞습니까? ifelse()으로 벡터화하고 싶었지만 i 번째 항목을 i-1 번째 항목으로 바꾸는 방법을 알 수 없었습니다.엔트리 i의 값을 취할 때 루프를 피함

> 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 (Last Observation Carried Forward)에서 구현됩니다. 여기를 참조하십시오 : Propagating data within a vector

+0

고마워요! (응답이 이미 여기에있는 시간의 절반 ... 올바른 문구 만 검색하면됩니다.) –

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 
관련 문제