Допустим, у меня есть вектор, заполненный NA
с, за исключением каждого 5-го значения, которое может быть одним из двух уровней:
RNGkind('Mersenne-Twister')
set.seed(42)
x <- NULL
for(i in 1:1000){
x <- c(x,c(sample(c('Hey', 'Hullo'), 1, rep = F), rep(NA, 4)))
}
x
Я хочу заполнить NA
сосновываясь на том, что их окружает:
"Hullo" NA NA NA NA "Hey": NAs become "Hey"
"Hullo" NA NA NA NA "Hullo" NAs become "Hullo"
"Hey" NA NA NA NA "Hullo": NAs become "Hullo"
"Hey" NA NA NA NA "Hey": NAs become "Hey"
Я придумал цикл for
, который просматривает каждый элемент итеративно и заполняет NA
s, основываясь на множестве операторов if
:
for(i in 1:length(x)){
if(!is.na(x[i])){
next
}else{
if(x[i-1] == 'Hullo' & x[i+4] == 'Hullo' | x[i-1] == 'Hey' & x[i+4] == 'Hullo'){
x[i:(i+3)] <- 'Hullo'
}else{
x[i:(i+3)] <- 'Hey'
}
}
}
Но это немного хакерский способ сделать это, и при этом он не касается хвостовой части вектора, где может быть NA
.В идеале, последняя группа NA
должна соответствовать выходным данным последней группы.
Если это облегчает задачу, всегда будет четыре NA
с между двумя не NA
с.
Есть ли:
- более элегантный / более быстрый способ сделать это?
- способ заполнить конец вектора без необходимости делать это вручную?
РЕДАКТИРОВАТЬ: Добавлено то, что будет последней группой NA
с, и подтвердить, что не NA
с всегда происходит всогласованные интервалы (каждый 5-й элемент)