НС не допускаются в индексированных присвоениях

У меня простая проблема, но я не мог понять логику ее преодоления.

У меня есть числовые векторы с NA и вы хотите применить к ним зависящую от условий операцию.

Простой пример, аналогичный моей проблеме:

x <- c(1,3,5,7,NA,2,4,6)
x[x>=5] <- c(1:8)[x>=5]
x[x<5] <- (c(1:8)*10)[x<5]

Он возвращает ошибку "NAs недопустимы в индексированных назначениях", поэтому я хотел бы знать, что было бы разумным решением для этого, учитывая, что выполнение каждой атрибуции работает по-разному, как и ожидалось.

Я хотел бы получить ожидаемый результат:

[1]  10  20  3  4 NA  60  70  8

Предпочтительно без необходимости создания цикла for, поскольку эта операция уже находится в функции для нулевого моделирования с большим количеством итераций, которая занимает возраст.

Заранее спасибо, Леонардо

Ответ 1

Ваша логика должна также исключать NA в подмножестве. См. Следующий пример. Обратите внимание, что векторы подмножеств сохраняются до изменения x.

x <- c(1,3,5,7,NA,2,4,6)
subset1 <- x>=5 & !is.na(x)
subset2 <-  x<5 & !is.na(x)

x[subset1] <- which(subset1)
x[subset2] <- 10*which(subset2)

Ответ 2

Я думаю, что вы смешиваете назначение и подписывание. Я верю, что то, что вам нужно, - это нечто более близкое к этому:

x <- c(1,3,5,7,NA,2,4,6)
x.greater <- c(1:8)[x>=5]
x.less <- (c(1:8)*10)[x<5]

x.greater
# 3  4 NA  8
x.less
# 10 20 NA 60 70

result <- c(x.greater, x.less)
result
# 3  4 NA  8 10 20 NA 60 70