web-dev-qa-db-fra.com

R déplace la colonne en dernier en utilisant dplyr

37
dule arnaux

Après quelques retouches, ce qui suit fonctionne et nécessite très peu de dactylographie.

data%>%select(-b,b)

61
dule arnaux
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?

33
Arthur Yip

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
10
akrun

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()
4
docendo discimus

df <-df [ c (which (colnames (df)! = "YourColumnName"), that (colnames (df) == "YourColumnName"))]

0
f2003596