Pour un data.frame avec n colonnes, j'aimerais pouvoir déplacer une colonne de n’importe lequel des 1. n-1) positions, pour être la nième colonne (c.-à-d. une non-dernière colonne pour être la dernière colonne). Je voudrais aussi le faire en utilisant dplyr
. Je voudrais le faire sans simplement taper les noms de toutes les colonnes.
Par exemple:
data<-data.frame(a=1:5, b=6:10, c=11:15)
Cela fonctionne, mais n'est pas la manière dplyr
:
data[,c(colnames(data)[colnames(data)!='b'],'b')]
C'est le dplyr
moyen de créer une colonne b
en premier:
data%>%select(b, everything())
Mais cela ne marche pas pour que la colonne b
dure:
data%>%select(everything(), b)
Cela fonctionne, mais nécessite que je tape toutes les colonnes:
data%>%select(a,c,b)
Alors, y a-t-il une manière élégante de faire cela?
Questions connexes:
Après quelques retouches, ce qui suit fonctionne et nécessite très peu de dactylographie.
data%>%select(-b,b)
data%>%select(-b,everything())
déplacera la variable b à la fin.
En effet, une variable négative dans la première position de select provoque un comportement spécial dans select (), qui consiste à insérer toutes les variables. Ensuite, il supprime b, puis il est rajouté avec la partie everything ().
Expliqué par Hadley lui-même: https://github.com/tidyverse/dplyr/issues/2838
Voir aussi cette autre réponse pour d'autres exemples sur la façon de déplacer certaines colonnes à la fin et d'autres colonnes au début: Comment la fonction de sélection de dplyr, tout (), diffère-t-elle de la copie?
Nous pouvons soit utiliser
data %>%
select(-one_of('b'), one_of('b'))
# a c b
#1 1 11 6
#2 2 12 7
#3 3 13 8
#4 4 14 9
#5 5 15 10
Ou
data %>%
select(matches("[^b]"), matches("b"))
ou avec le select_
data %>%
select_(.dots = c(setdiff(names(.), 'b'), 'b'))
# a c b
#1 1 11 6
#2 2 12 7
#3 3 13 8
#4 4 14 9
#5 5 15 10
Comme il n'y a pas de solution toute faite à cela dans dplyr, vous pouvez définir votre propre petite fonction pour le faire pour vous:
move_last <- function(DF, last_col) {
match(c(setdiff(names(DF), last_col), last_col), names(DF))
}
Vous pouvez ensuite l'utiliser facilement dans un appel normal select
:
mtcars %>% select(move_last(., "mpg")) %>% head()
Vous pouvez également déplacer plusieurs colonnes jusqu'à la fin:
mtcars %>% select(move_last(., c("mpg", "cyl"))) %>% head()
Et vous pouvez toujours fournir d'autres arguments à sélectionner, par exemple pour supprimer une colonne:
mtcars %>% select(move_last(., "mpg"), -carb) %>% head()
df <-df [ c (which (colnames (df)! = "YourColumnName"), that (colnames (df) == "YourColumnName"))]