Повторная вставка NA в вектор

У меня есть вектор значений, которые включают в себя NA. Значения должны быть обработаны внешней программой, которая не может обработать NA, поэтому они удаляются, записываются в файл, обрабатываются, а затем считываются, что приводит к вектору длины числа не-NA., Например, предположим, что входное значение равно 7 3 4 NA 5 4 6 NA 1 NA, тогда выходное значение будет равно 7 значениям. Что мне нужно сделать, это снова вставить NA в положение.

Итак, учитывая два вектора X и Y:

 > X
 [1]  64   1   9 100  16  NA  25  NA   4  49  36  NA  81
 > Y
 [1]  8  1  3 10  4  5  2  7  6  9

производить:

8 1 3 10 4 NA 5 NA 2 7 6 NA 9

(вы можете заметить, что X это Y^2, это только для примера).

Я мог бы отключить функцию, чтобы сделать это, но мне интересно, есть ли какие-нибудь хорошие хитрые способы сделать это... split, list, length... ммм...

4 ответа

Решение

Еще один вариант на ту же тему

rena <- function(X,Z){
    X[which(!is.na(X))]=Z    
    X
}

R автоматически заполняет остальное с помощью NA.

Изменить: Исправлено Марек.

na.omit сохраняет атрибут местоположения NA в оригинальной серии, так что вы можете использовать это, чтобы знать, куда поместить пропущенные значения:

Y <- sqrt(na.omit(X))
Z <- rep(NA,length(Y)+length(attr(Y,"na.action")))
Z[-attr(Y,"na.action")] <- Y
#> Z
# [1]  8  1  3 10  4 NA  5 NA  2  7  6 NA  9

Отвечать на мой собственный вопрос, вероятно, очень плохая форма, но я думаю, что это, вероятно, о ближайшем:

rena <- function(X,Z){
Y=rep(NA,length(X))
Y[!is.na(X)]=Z    
Y
}

Можно также попробовать заменить:

replace(X, !is.na(X), Y)
Другие вопросы по тегам