2017-08-28 4 views
1

je la trame de données suivantes:Comment déplacer seul NA en bas de la colonne en R

example=data.frame(x=c(1,2,3),y=c(4,5,6)) 


    x  y 
1 1  4 
2 2  5 
3 3  6 

Je veux supprimer une valeur unique, de 1 des colonnes, donc je reçois ce (que j'ai réussi en utilisant example$x[example$x==2]<-NA):

 x  y 
1 1  4 
2 NA 5 
3 3  6 

Mais maintenant, je suis coincé, parce que je veux maintenant passer les valeurs restantes, de sorte que les agences nationales sont en bas:

 x  y 
1 1  4 
2 3  5 
3 NA 6 

En fin de compte, je veux être en mesure de le faire pour les deux colonnes, avec des valeurs uniques dans les différentes lignes, par exemple:

de:

 x  y 
1 1  NA 
2 NA 5 
3 3  6 

Pour:

 x  y 
1 1  5 
2 3  6 
3 NA NA 

Espérons que quelqu'un a une solution simple! Merci

+2

Quelle est la raison d'être pour ce faire? Une trame de données est censée relier les valeurs d'une rangée les unes aux autres. En faisant cela, vous modifiez la relation où 'x = 1' se rapporte à' y = 4' à 'x = 1' se rapporte à' y = 5'. – Benjamin

+0

Ma trame de données est x = ID femme et y = ID homme. Je dois faire correspondre une femelle à un mâle en fonction de leur parenté, ce qui est différent pour chaque couple possible). Une fois qu'une femelle est choisie, j'ai besoin de retirer cet individu de la colonne et tous les ID restants se déplacent donc il n'y a pas de vide. J'espérais qu'il y aurait une solution facile, mais je devrais peut-être réévaluer comment utiliser ces valeurs. Peut-être pas comme un dataframe, mais comme séparé. –

+0

Les bonnes nouvelles sont que votre question est logique dans le contexte que vous avez fourni. Les meilleures nouvelles sont que R a probablement de meilleures approches pour faire votre correspondance.L'approche dépendra un peu de vos critères de correspondance. C'est probablement une question distincte de celle-ci, cependant. – Benjamin

Répondre

2

Voici une méthode utilisant is.na et sous-ensemble [. À partir de cet ensemble de données.

example=data.frame(x=c(1,NA,3),y=c(NA,5,6)) 
example 
    x y 
1 1 NA 
2 NA 5 
3 3 6 

vous traversent chaque variable avec lapply et prendre des variables qui ne manquent pas, et ajouter à ces valeurs manquantes à la fin. Ensuite, réinjectez ce résultat dans l'ensemble de données d'origine à l'aide de example[] <-, qui conserve la structure data.frame.

example[] <- lapply(example, function(x) c(x[!is.na(x)], x[is.na(x)])) 
example 
    x y 
1 1 5 
2 3 6 
3 NA NA 

Nous pouvons également utiliser la plus récente (R 3.3.3) fonction grouping comme celui-ci

example[] <- lapply(example, function(x) x[grouping(is.na(x))]) 

ou order

example[] <- lapply(example, function(x) x[order(is.na(x))]) 

Dans les deux dernières, la clé est de commander sur is.na plutôt que les éléments eux-mêmes. De cette façon, vous préservez l'ordre d'origine des éléments non vides.

+2

L'auteur de l'article a mentionné qu'il voulait changer les éléments, pas les trier! –

+0

@DamianoFantini bon appel. Je l'ai réparé. – lmo

+1

@DamianoFantini Qui est * he *? ;-) –

2

Nous pouvons également utiliser tidyverse

library(dplyr) 
example %>% 
    mutate_all(funs(.[order(is.na(.))])) 
# x y 
#1 1 5 
#2 3 6 
#3 NA NA 

Si les colonnes doivent dépendre

example %>% 
     arrange_all(funs(is.na(.)))