web-dev-qa-db-fra.com

dplyr: sélectionne les noms de colonnes contenant des espaces blancs

df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b"
), row.names = c(NA, -3L), class = "data.frame")

et les données ressemblent

  a a a b
1   1   2
2   2   3
3   3   4

Appel suivant pour sélectionner

select(df, 'a a')

donne

Error in abs(ind[ind < 0]) : 
  non-numeric argument to mathematical function

Comment puis-je sélectionner "a a" et/ou le renommer en quelque chose sans espace en utilisant select? Je connais les approches suivantes:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

mais si je travaille sur un grand ensemble de données, comment puis-je obtenir une correspondance exacte sans connaître le numéro d'index ou les noms de colonnes similaires?

47
Flux

Vous pouvez select la variable en utilisant des raccourcis `.

select(df, `a a`)
#   a a
# 1   1
# 2   2
# 3   3

Cependant, si votre objectif principal est de renommer la colonne, vous pouvez utiliser rename dans le package plyr, dans lequel vous pouvez utiliser les deux "" et ``.

rename(df, replace = c("a a" = "a"))
rename(df, replace = c(`a a` = "a"))

Ou dans base R:

names(df)[names(df) == "a a"] <- "a"

Pour une description plus approfondie de l'utilisation de diverses citations, voir ?Quotes. La section "Noms et identifiants" est particulièrement pertinente ici:

d'autres noms [syntaxiquement invalides] peuvent être utilisés à condition qu'ils soient cités. La citation préférée est le backtick ".

Voir également ?make.names sur les noms valides.

Voir aussi cet article sur le changement de nom dans dplyr

55
Henrik

Quelques alternatives aux backticks, à partir de dplyr 0.5.0, la version actuelle à ce jour.

Si vous essayez de sélectionner par programme un argument en tant que colonne et que vous ne voulez pas renommer ou faire quelque chose comme paste/sprintf le nom de la colonne en guillemets, vous pouvez utiliser as.name en conjonction avec la version évaluation non standard de select, qui est select_:

dplyr::select_(df, as.name("a a"))

De nombreuses fonctions dplyr ont des versions non standard. Dans le cas de select en particulier, vous pouvez également utiliser la version standard avec l'aide de sélection one_of. Voir ?dplyr::select_helpers pour la documentation:

dplyr::select(df, dplyr::one_of("a a"))
2
Andy