2010-10-11 701 views
6

Tengo un vector de valores que incluyen NA. Los valores deben ser procesados ​​por un programa externo que no puede manejar las NA, por lo que se eliminan, se escriben en un archivo, se procesan y luego se vuelven a leer, lo que da como resultado un vector de la longitud de la cantidad de no NA. . Ejemplo, supongamos que la entrada es 7 3 4 NA 5 4 6 NA 1 NA, entonces la salida sería solo 7 valores. Lo que tengo que hacer es volver a insertar las NA en su posición.Reinserción de NA en un vector

Por lo tanto, dados dos vectores 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 

producen:

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

(puede observar que X es Y^2, eso es sólo para un ejemplo).

de que pudiera llamar a cabo una función para hacer esto, pero me pregunto si hay alguna forma tricksy agradables de hacerlo ... dividida, lista, longitud ... hmmm ...

+0

Aunque sólo por ejemplo, ¿trató de: sqrt (x) –

Respuesta

3

Otra variante sobre el mismo tema

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

R llena automáticamente el resto con NA.

Editar: Corregido por Marek.

+1

Incorrecto: 'rena (c (1,2, NA), c (10,20))'. ¿Por qué molestarse con 'Y', usar' X' como mi comentario a la respuesta de Spacedman. – Marek

+0

@marek: buena captura. Thx para la corrección. –

4

responder a mi propia pregunta es, probablemente, mala forma muy, pero creo que este es probablemente el más bonito:

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

podría reducirse a la función '(X, Z) {X [is.na (X) ] <- Z; X} '. – Marek

+1

¡Responder bien a su propia pregunta es en realidad una buena forma! – Contango

5

na.omit mantiene un atributo de la ubicación de la NA en la serie original, por lo que podría utilizar eso para saber dónde poner los valores que faltan:

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

También puede intentar sustituir:

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

+1 solución más limpia hasta el momento. –

Cuestiones relacionadas