web-dev-qa-db-fra.com

comment supprimer des colonnes en passant le nom de la variable avec dplyr?

J'ai un df comme suit:

a <- data_frame(keep=c("hello", "world"),drop = c("Nice", "work"))
a
Source: local data frame [2 x 2]
   keep  drop
  (chr) (chr)
1 hello  Nice
2 world  work

Je peux utiliser a %>% select(-drop) pour supprimer la colonne sans problème. Cependant, si je souhaite transmettre une variable à la colonne drop, alors elle renvoie une erreur.

name <- "drop"
a  %>% select(-(name))
Error in -(name) : invalid argument to unary operator
24
HappyCoding

Vous pouvez utiliser one_of Pour trouver les positions de colonne, puis utiliser - Pour la supprimer, select(-one_of(name)), si vous cochez ?select, L'utilisation est documentée dans la section Drop variable dans le Exemples:

name <- "drop"
a %>% select(-one_of(name))

# A tibble: 2 × 1
#   keep
#  <chr>
#1 hello
#2 world

Ou avec select_, Vous devez coller - Avec les noms de colonne pour les supprimer et transmettre les noms de colonne collés au paramètre .dots S'il y a plus d'une colonne à être chuté:

name <- "drop"
a %>% select_(.dots = paste("-", name))

# A tibble: 2 × 1
#   keep
#  <chr>
#1 hello
#2 world
38
Psidom

Vous pouvez utiliser simplement

a <- data_frame(keep=c("hello", "world"),drop = c("Nice", "work"))
select(a, -starts_with('drop'))
#   Source: local data frame [2 x 1]
#
#   keep
#   (chr)
# 1 hello
# 2 world

vous devez également rechercher des solutions déjà écrites. Veuillez lire le document ici Sélectionner/renommer les variables par nom.DPLYR

J'espère que cela fera le travail pour vous :) @ Psidom, merci pour la mise à jour de votre réponse .. mais je demanderai aux votants de voter pour moi aussi, car je suis récemment devenu un utilisateur actif et je dois encore obtenir les privilèges de base sur stackoverflow.

9
Mandar

Nous pouvons utiliser select avec setdiff

a %>%
    select_(setdiff(names(.), name))
# A tibble: 2 × 1
#   keep
#   <chr>
#1 hello
#2 world
4
akrun

Quelques autres possibilités:

name <- "drop"
a %>% `[<-`(name, value=NULL)
a %>% magrittr::inset(name,value=NULL)
a %>% purrr::modify_at(name,~NULL)
3
Moody_Mudskipper

Je pouvais seulement faire fonctionner ces solutions en dissociant d'abord les données en utilisant ungroup:

df <- df  %>%  ungroup  %>%  select(-hello)

Remarquez qu'il n'y a pas de guillemets sur le nom de la colonne à supprimer (bonjour). De plus, pour supprimer plusieurs colonnes, il suffit de placer un , après bonjour et ajoutez la deuxième colonne.

0
Marty999