Избегая цикла, когда запись я мог бы принять значение записи я-1 - PullRequest
1 голос
/ 07 августа 2010

У меня есть векторы, в основном NA записей. Я хочу заменить каждую NA предыдущей записью этого вектора, не являющейся NA. В частности, первая запись всегда будет 1, за которой следует набор NA с, который я хочу заменить на 1. Запись i может быть другой цифрой, скажем, 2, за которой следует еще NA s, которые я хочу заменить на 2. И так далее. Цикл ниже достигает этого, но должен быть более R способ сделать это, верно? Я хотел векторизовать с ifelse(), но я не мог понять, как заменить i th запись на i-1 th запись.

> 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, в которой есть столбец, показывающий, когда и как происходит разделение.

Ответы [ 2 ]

5 голосов
/ 07 августа 2010

Это уже реализовано в пакете zoo, функция na.locf (последнее наблюдение перенесено).Смотрите также здесь: Распространение данных внутри вектора

1 голос
/ 07 августа 2010

Если вы настраиваетесь на дробление акций, возможно, вы могли бы использовать adjRatios из пакета TTR. Все тяжелые работы выполняются на С, так что это очень быстро. См. adjustOHLC для примера того, как использовать adjRatios для корректировки ваших данных.

> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...