Повторная вставка NA в вектор - PullRequest
6 голосов
/ 11 октября 2010

У меня есть вектор значений, которые включают 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, длина ... ммм ...

Ответы [ 4 ]

5 голосов
/ 11 октября 2010

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
4 голосов
/ 12 октября 2010

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

replace(X, !is.na(X), Y)
4 голосов
/ 11 октября 2010

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

rena <- function(X,Z){
Y=rep(NA,length(X))
Y[!is.na(X)]=Z    
Y
}
3 голосов
/ 11 октября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...