Я уверен, что есть лучшее решение этой проблемы, но это должно сработать:
A <-
c(NA, NA, NA, NA, 1, NA, NA, 4, NA, NA, 1, NA, NA, NA, NA, NA, 4, NA, 1, NA, 4)
replace <- FALSE
for (i in 1:length(A)) {
if (!is.na(A[i])) {
if (A[i] == 1) {
start <- i + 1
replace <- TRUE
}
if (A[i] == 4 & replace == TRUE) {
A[start:(i - 1)] <- 2
replace <- FALSE
}
}
}
РЕДАКТИРОВАТЬ: , если вы хотите заменить только NA, еслинет ничего другого (например, 3) между 1 и 3, вы можете использовать это:
A <-
c(NA, NA, NA, NA, 1, NA, 3, 4, NA, NA, 1, NA, NA, NA, NA, NA, 4, NA, 1, NA, 4)
replace <- FALSE
for (i in 1:length(A)) {
if (!is.na(A[i])) {
if (A[i] == 1) {
start <- i + 1
replace <- TRUE
}
if (A[i] == 4 & replace == TRUE) {
A[start:(i - 1)] <- 2
replace <- FALSE
}
if (A[i] != 4 & A[i] != 1){
replace <- FALSE
}
}
}
Вывод:
> A
[1] NA NA NA NA 1 NA 3 4 NA NA 1 2 2 2 2 2 4 NA 1 2 4
И если вы хотите заменить толькоNA, но сохраняют другие значения от 1 до 4, используют это:
A <-
c(NA, NA, NA, NA, 1, NA, 3, 4, NA, NA, 1, NA, NA, NA, NA, NA, 4, NA, 1, NA, 4)
replace <- FALSE
for (i in 1:length(A)) {
if (!is.na(A[i])) {
if (A[i] == 1) {
start <- i + 1
replace <- TRUE
}
if (A[i] == 4 & replace == TRUE) {
sub <- A[start:(i - 1)]
sub[is.na(sub)] <- 2
A[start:(i - 1)] <- sub
replace <- FALSE
}
}
}
Вывод:
> A
[1] NA NA NA NA 1 2 3 4 NA NA 1 2 2 2 2 2 4 NA 1 2 4