2010-10-11 5 views
6

J'ai un vecteur de valeurs qui incluent les NA. Les valeurs doivent être traitées par un programme externe qui ne peut pas gérer les NA, elles sont donc supprimées, écrites dans un fichier, traitées, puis relues, ce qui donne un vecteur de la longueur du nombre de non-NA. . Par exemple, supposons que l'entrée est 7 3 4 NA 5 4 6 NA 1 NA, alors la sortie sera juste 7 valeurs. Ce que je dois faire est de réinsérer les NA en position.Réinsertion des NA dans un vecteur

Ainsi, compte tenu de deux vecteurs X et 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 

produisent:

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

(vous pouvez remarquer que X est Y^2, c'est juste un exemple).

je pouvais frapper une fonction pour faire cela, mais je me demande s'il y a des belles façons tricksy de le faire ... Split, liste, longueur ... hmmm ...

+0

Bien que, par exemple, avez-vous essayé: sqrt (x) –

Répondre

3

Une autre variante du même thème

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

R remplit automatiquement le reste avec NA.

Édition: Corrigé par Marek.

+1

Incorrect: 'rena (c (1,2, NA), c (10,20))'. Pourquoi s'embêter avec «Y», utilisez «X» comme c'est mon commentaire à la réponse de Spacedman. – Marek

+0

@marek: bonne prise. Merci pour la correction. –

4

répondre à ma propre question est probablement forme très mauvais, mais je pense que cela est probablement la plus nette:

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

pourrait être raccourci à 'fonction (X, Z) {X [is.na (X) ] <- Z; X} '. – Marek

+1

Répondre à votre propre question est en fait une bonne forme! – Contango

5

na.omit conserve un attribut des emplacements des NA dans la série originale, vous pouvez donc l'utiliser pour savoir où mettre les valeurs manquantes:

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

peut aussi essayer de remplacer:

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

+1 solution la plus propre jusqu'à présent. –