2010-10-11 13 views
6

Ho un vettore di valori che include NA. I valori devono essere elaborati da un programma esterno che non è in grado di gestire le NA, quindi vengono rimossi, scritti in un file, elaborati, quindi letti di nuovo, risultando in un vettore della lunghezza del numero di non-NA . Ad esempio, supponiamo che l'input sia 7 3 4 NA 5 4 6 NA 1 NA, quindi l'output sarebbe solo 7 valori. Quello che devo fare è reinserire le NA in posizione.Reinserimento di NA in un vettore

Quindi, dati due vettori X e 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 

produrre:

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

(si può notare che X è Y^2, questo è solo un esempio).

ho potuto mettere fuori uso una funzione per fare questo, ma mi chiedo se ci sono delle belle modi furbata di farlo ... Split, elenco, lunghezza ... hmmm ...

+0

Anche se solo per esempio, hai provato: sqrt (x) –

risposta

3

Un'altra variante sullo stesso tema

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

R riempie automaticamente il resto con NA.

Modifica: corretto da Marek.

+1

Sbagliato: 'rena (c (1,2, NA), c (10,20))'. Perché preoccuparsi di 'Y', usa' X' come è il mio commento alla risposta Spacedman. – Marek

+0

@marek: buona cattura. Thx per la correzione. –

4

rispondere alla mia stessa domanda è probabilmente molto cattiva forma, ma penso che questo è probabilmente la più pulita:

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

potrebbe essere ridotto a 'funzione di (X, Z) {X [is.na (X) ] <- Z; X} '. – Marek

+1

Rispondere bene alla tua domanda è in realtà una buona forma! – Contango

5

na.omit mantiene un attributo dei luoghi del NA nella serie originale, così si potrebbe utilizzare quello di conoscere dove mettere i valori mancanti:

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

può anche provare sostituire:

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

+1 soluzione più pulita finora. –

Problemi correlati