2010-10-11 18 views
6

Mam wektor wartości, które zawierają NA. Wartości muszą zostać przetworzone przez zewnętrzny program, który nie może obsługiwać NA, więc są one usuwane, zapisywane do pliku, przetwarzane, a następnie odczytywane z powrotem, co daje wektor długości liczby nie-NA . Przykład, załóżmy, że wejście to 7 3 4 NA 5 4 6 NA 1 NA, wtedy wynik wynosiłby 7 wartości. Muszę ponownie wstawić NA na pozycję.Ponowne wstawianie NA do wektora

Więc podane dwa wektory X i 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 

Produkujemy:

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

(można zauważyć, że X jest Y^2, to jest to tylko dla przykładu).

mogłem wybić funkcję, aby to zrobić, ale zastanawiam się, czy nie ma żadnych ciekawych Tricksy sposoby robienia tego ... rozłamu, listy, długość ... hmmm ...

+0

Chociaż tylko na przykład, czy spróbować: sqrt (x) –

Odpowiedz

3

Inny wariant tego samego tematu

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

R automatycznie wypełnia resztę z NA.

Edytuj: Poprawione przez Marka.

+1

Nieprawidłowe: 'rena (c (1,2, NA), c (10,20))'. Po co zawracać sobie głowę 'Y', używaj' X', ponieważ jest to mój komentarz do odpowiedzi Spacedman. – Marek

+0

@marek: dobry połów. Thx za korektę. –

4

Odpowiadając na moje własne pytanie jest prawdopodobnie bardzo zła forma, ale myślę, że jest to prawdopodobnie o neatest:

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

można skrócić do 'funkcji (X, Z) {X [is.na (X) ] <- Z; X} '. – Marek

+1

Odpowiadając na własne pytanie dobrze jest naprawdę dobrą formą! – Contango

5

na.omit trzyma atrybut lokalizacje NA w oryginalnej serii, więc można używać, aby wiedzieć, gdzie umieścić brakujących wartości:

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

Można też spróbować wymienić:

replace(X, !is.na(X), Y) 
+0

+1 najczystsze rozwiązanie do tej pory. –