J'ai un dataframe et une liste de colonnes dans ce dataframe que j'aimerais supprimer. Prenons le iris
jeu de données comme exemple. Je voudrais laisser tomber Sepal.Length
et Sepal.Width
et utiliser uniquement les colonnes restantes. Comment faire cela en utilisant select
ou à select_
partir du dplyr
package?
Voici ce que j'ai essayé jusqu'à présent:
drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)
Erreur dans -drop.cols: argument non valide pour l'opérateur unaire
iris %>% select_(.dots = -drop.cols)
Erreur dans -drop.cols: argument non valide pour l'opérateur unaire
iris %>% select(!drop.cols)
Erreur dans! Drop.cols: type d'argument non valide
iris %>% select_(.dots = !drop.cols)
Erreur dans! Drop.cols: type d'argument non valide
J'ai l'impression de manquer quelque chose d'évident car cela semble être une opération assez utile qui devrait déjà exister. Sur Github, quelqu'un a publié un problème similaire et Hadley a déclaré utiliser une `` indexation négative ''. C'est ce que (je pense) j'ai essayé, mais en vain. Aucune suggestion?
iris
, mais pas sur mon dataframe réel (iris
était un exemple de jouet). Mon dataframe contient 4558 lignes et 147 colonnes. Le message d'erreur que j'ai reçu étaitError in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes
. Une idée de pourquoi cela pourrait se produire?select_vars
au lieu deselect
. Maintenant, cela fonctionne parfaitement!one_of
? Sauf si je manque quelque chose, il n'apparaît pas dans la documentation du paquet (help(package='dplyr')
).help(one_of, package = "dplyr")
. Au moins, il est dans la version 0.5.0 du package. Mais cela aide à lire les blogs publiés par Hadley lorsqu'il y a des mises à jour de l'un de ses packages. Et certaines fonctions sont documentées dans d'autres fonctions. Malheureusement, cela nécessite la lecture de toute la documentation, ce que je fais surtout lorsque je veux quelque chose qui n'est pas immédiatement évident ou possible avec la fonction.Essayez aussi
la source
Au-delà,
select(-one_of(drop.cols))
il existe quelques autres options pour supprimer des colonnesselect()
qui n'impliquent pas de définir tous les noms de colonnes spécifiques (en utilisant les exemples de données dplyr starwars pour une plus grande variété de noms de colonnes):la source
select_if(~!is.list(.))
équivalent àselect_if(is.list(.))
?~
c'est le raccourci purrr pour définir une fonction anonyme, ce n'est pas un autre symbole pour non. Par exemple, ces deux signifient la même chosefunction(x) {!is.list(x)}
et~!is.list(.)
. pensez~
à un raccourci pourfunction(.)
.Soyez prudent avec la
select()
fonction, car elle est utilisée à la fois dans les paquets dplyr et MASS, donc si MASS est chargé, select () peut ne pas fonctionner correctement. Pour savoir quels packages sont chargés, saisissez-lessessionInfo()
et recherchez-les dans la section "autres packages attachés:". S'il est chargé, tapezdetach( "package:MASS", unload = TRUE )
et votreselect()
fonction devrait fonctionner à nouveau.la source
dplyr::select()
.dselect <- dplyr::select()
.Nous pouvons essayer
la source
dplyr
capacité du battage médiatique environnant à rendre les tâches d'analyse de base faciles à lire et à écrire, je suis déçu que la solution réelle ressemble à une solution de contournement.one_of
autre solution est la voie à suivre. Je l'ai oublié.Une autre façon consiste à muter les colonnes indésirables en
NULL
, cela évite les parenthèses incorporées:la source
Si vous avez un caractère spécial dans les noms de colonne, cela fonctionne
select
ouselect_
peut ne pas fonctionner comme prévu. Cette propriétédplyr
d'utilisation"."
. Pour faire référence à l'ensemble de données dans la question, la ligne suivante peut être utilisée pour résoudre ce problème:la source
Tu peux essayer
la source