web-dev-qa-db-fra.com

dplyr "Select" - Erreur: nom de colonne dupliqué trouvé

J'essaie d'extraire des colonnes d'un DT vers un nouveau DT en utilisant select {dplyr}

extract_Data <- select(.data = master_merge, subjectID, activity_ID,
                           contains("mean\\(\\)"), contains("std\\(\\)"))

Il y a 563 colonnes, je demande donc d'extraire les première et deuxième colonnes (sujet, activité) et toutes les autres colonnes où mean () ou std () est présent. 

AUCUNE colonne en double ne peut être créée ici. tellement perplexe quant au pourquoi. J'ai essayé toutes les variantes de select mais toujours Erreur: nom de colonne dupliqué.

Comment puis-je résoudre ce problème - J'ai parcouru les 563 noms de colonnes et il n'y a pas de doublons. 

16
scopa

La racine du problème est composée de caractères non valides dans les noms de colonne d'origine. La discussion dans Restrictions sur les noms de variables dans R s'applique également aux noms de colonnes. Essayez de forcer les noms de colonne uniques avec valid caractères, avec make.names (). 

valid_column_names <- make.names(names=names(master_merge), unique=TRUE, allow_ = TRUE)
names(master_merge) <- valid_column_names
31
Lantana

Voici la solution que j'ai trouvée:

data <- data[ , !duplicated(colnames(data))]

Ceci sous-définit le jeu de données sans toutes les colonnes dupliquées.

J'espère que ça aide.

12
laurent

Les doublons hors filtre de filtrage peuvent provoquer l'erreur "nom dupliqué". Exemple:

library(dplyr)
x <- data.frame(1, 2, 3)
names(x) <- c("a", "a", "b")

x %>%
  select(matches("b"))

Si vous n’avez pas besoin de ces colonnes, éliminez-les avec

x <- x[ !duplicated(names(x)) ]
8
bergant

Pas une réponse directe, mais cela aidera beaucoup de gens.

Pour tous les étudiants de Coursera confrontés à ce problème avec cet ensemble de données: il y a sont noms de colonnes en double. Par exemple, 'fBodyAccJerk-bandsEnergy () - 1,16' est trouvé deux fois. Vérifier:

your_merged_data_with_column_names [ 400: 420]

J'aimerais afficher la sortie, mais mon navigateur ne prend pas en charge le bouton 'Code' ni le raccourci ctrl-K et il y a trop de données à indenter manuellement. Essayez ce code par vous-même et vérifiez soigneusement les "Variables non affichées"!

Je travaille actuellement sur une solution moi-même, en utilisant éventuellement les réponses ci-dessus ou le forum du cours.

0
Wil

Sur la base de Excellente réponse Lantana , voici une fonction pour une solution dplyr pure avec une intégration pipe:

validate.names = function(df){
  rtn = df
  valid_column_names = make.names(names=names(df), unique=TRUE, allow_ = TRUE)
  names(rtn) = valid_column_names
  rtn
}

Vous pouvez ensuite l'utiliser comme ceci: 

extract_Data %>% validate.names
0
Dan Chaltiel